我有一个在树集中添加的任务> 10000000个序列元素。
如果我使用
for (long index = 0; index < 10000000; index++)
{
result.add(index);
}
需要8083毫秒。是否有任何解决方案可以提高此任务的性能?
https://github.com/cyberterror/TestRanges
P.S。目前最快的方法是:List<Integer> range = IntStream.range(0, 10000000).boxed().collect(Collectors.toList());
,结果为~370 ms
答案 0 :(得分:1)
您已经按正确的顺序添加项目,TreeSet将在每个复杂的添加项目后自行排序,LinkedHashSet只保留插入顺序。
因此,如果你真的需要一个Set来实现LinkedHashSet实现,就像这里:
Set<Long> result = new LinkedHashSet<Long>();
for (Long index = 0L; index != 10000000L;) { //Avoid autoboxing
result.add(index++);
}
答案 1 :(得分:1)
你真的需要收藏吗?为了这个目的,如果是这样的话? 实际上,使用普通阵列可以提高性能。
long [] ar = new long[10000000];
for (int i = 0; i < 10000000; i++) {
ar[i] = (long )i;
}
...
BUILD SUCCESS
------------------------------------------------------------------------
Total time: 0.553 s
UPD:实际上,可以使用Arrays实用程序对阵列执行大多数操作
long [] ar = new long[10000000];
for (int i = 0; i < 10000000; i++) {
ar[i] = (long )i;
}
long[] copyOfRange = Arrays.copyOfRange(ar, 50000, 1000000);
...
BUILD SUCCESS
------------------------------------------------------------------------
Total time: 0.521 s
答案 2 :(得分:1)
尝试HPPC:Java的高性能原始集合
许可证:Apache License 2.0
<dependency>
<groupId>com.carrotsearch</groupId>
<artifactId>hppc</artifactId>
<version>0.7.1</version>
</dependency>
LongHashSet在1190ms执行:
LongSet result = new LongHashSet();
for (Long index = 0L; index < 10000000L;) {
result.add(index++);
}
LongScatterSet在850ms内执行:
LongSet result = new LongScatterSet();
for (Long index = 0L; index < 10000000L;) {
result.add(index++);
}
答案 3 :(得分:0)
TreeSet是一个平衡的红黑树。每次添加新项目时,树都要平衡需要花费很多时间。尝试以不同的顺序添加项目;实际上按此顺序:
这样,您将保持树的平衡,不会执行任何其他操作(以平衡树)。 只需确保您的算法计算下一个要添加的数字并不太复杂。