下面的代码花了5个小时才完成1M,呵呵,这太慢了.

int numbers = 10000000
int count = 0
def data = []
File file = new File("out.txt")

while (count < numbers) {
    def number = makeNumber(numbers)
    if (!data.contains(number)) {
        print count + ':Adding ' + number + '\n'
        data << number
        count++
    }
}

for (i in data) {
    print 'Appending ' + i + '\n'
    file.append(i + '\n')
}

String makeNumber(numbers) {
    def range = "83"
    return range + (new Random().nextInt(20000000) + numbers)
}

我目前正在try java.security.SecureRandom,就像在this request中一样来生成数字,但它对我来说是一个未知的API,所以它的速度很慢.许多其他选项并不能保证独特性或速度.我是独一无二的,我很确定这一点,但速度(请你给我一些 idea 来加快这一点?我在考虑发送到其他线程,但我遇到了同样的问题,不是吗?)

推荐答案

下面的groovy代码需要大约2.5秒来生成1000万个唯一的整数


@groovy.transform.CompileStatic
Set<Integer> generateUniqueNumbers(int count, int bound=20000000, SplittableRandom rnd = new SplittableRandom()) {
    Set<Integer> data = new HashSet<Integer>(count)
    while(data.size() < count){
        data.add( rnd.nextInt(bound) )
    }
    return data
}

@groovy.transform.CompileStatic
def writeToFile(Set<Integer> data, String path){
    new File(path).withWriter("UTF-8"){w->
        data.each{i-> w.append('83').append(i.toString()).append('\n')}
    }
}


def t = System.currentTimeMillis()
def data  = generateUniqueNumbers(10000000)
println data.size()
println "generate time = ${System.currentTimeMillis() - t} millis"

//writing to file
t = System.currentTimeMillis()
writeToFile(data, "/11/out.txt")
println "write time = ${System.currentTimeMillis() - t} millis"

结果:

10000000
generate time = 2636 millis
write time = 2182 millis

如果生成数字的顺序很重要-您可以使用LinkedHashSet而不是HashSet,但这会增加~x2-x3的执行时间

@groovy.transform.CompileStatic注释--当性能很重要并且有一个大/长循环时,请始终try 在Groovy中使用它.

UPD:使用SplittableRandom而不是Random,因为它更快

UPD2:增加了使用编写器的写入文件方法.原始问题File.append(...)中的实现每次打开和关闭文件.

Java相关问答推荐

Mat. n_Delete()和Mat. n_release的区别

如果一个子类没有构造函数,超类也没有构造函数,那么为什么我可以构造子类的实例呢?

ApachePOI:不带换行的新行

springboot start loge change

如何修复PDF重建过程中的文本定位

JOOQ中的子查询使用的是默认方言,而不是配置的方言

如何从Keyloak映射Hibernate实体中的用户

Kotlin Val是否提供了与Java最终版相同的可见性保证?

我可以在@Cacheable中使用枚举吗

从泛型枚举创建EnumMap

嘲笑黄瓜中的对象

如何在字节数组中反转UTF-8编码?

Java.time.OffsetDateTime的SQL Server数据库列类型是什么?

JPA无手术同品种器械可能吗?

Java List有一个在一个位置添加多个元素的方法,但我找不到一个在一个位置删除多个元素的方法

字符串的Gzip压缩在java11和java17中给出了不同的结果

如何使用Hibernate v6.2构建NamingStrategy,以表名作为所有列的前缀?

[jdk21][Foreign Function&;Memory API]MemoryLayout::varHandle通过可变数组进行 struct 化的问题

spring 更新多项管理关系

using case default on switch语句返回;预览特征切换中的模式匹配仅在源级别20及以上的情况下可用;