Java中最快的变量集

时间:2014-04-16 11:27:27

标签: java performance structure

我需要结构(Arraylist,LinkedList等),这种情况非常快: 虽然结构不是空的,但我在结构中搜索满足条件的元素,比方说k,删除满足k的元素并重新开始另一个条件让我们说k + 1。

e.g:

for (int i = 1 ; i <= 1000000; i++) {
  structure.add(i);
}

d = 2;

while (!structure.isEmpty()) {
  for(int boom : structure.clone) {
    if (boom % d == 2) {
      structure.remove(boom);
    }

    d++;
  }
}

5 个答案:

答案 0 :(得分:2)

如果元素是基元,则最快的结构很可能是专门的基元集合(例如,trove)。以下对盒装基元的引用是一个几乎可靠的缓存未命中,这可能会占据成本。

出于同样的原因,我不会建议LinkedList:由于缓存未命中,它已经死了。

如果订单不重要,那么ArrayList是完美的。而不是删除元素,将其替换为最后一个元素,并删除最后一个数组元素。这是一个O(1)操作,不会受到糟糕的空间局部性影响。

如果订单很重要,您可以构建自己的ArrayList类结构。不要删除元素,而是将其标记为删除元素,例如在BitSetboolean[]中。最后,通过将所有元素移动到正确位置并调整长度,在一次扫描中执行移除。优化后的循环很可能与CharMatcher.removeFrom loop类似。

更简单的解决方案是使用ArrayList并将所有幸存的元素复制到另一个元素。我敢打赌它会击败LinkedList手。作为一个次要的GC-friedly优化,您可以使用两个列表。

答案 1 :(得分:0)

对于这种情况,

LinkedList应该是最快的。显式使用迭代器(structure.iterator())并调用迭代器的remove方法而不是调用structure.remove(element)!

答案 2 :(得分:0)

我不知道您的确切用例,但这是一个注释。

如果你的谓词P1 .. PN预编译,可用,如果你没有修改集合的内容,如果你的谓词不相互依赖,你可能想要创建一个复合谓词,比如以某种逻辑顺序捆绑N个谓词,然后只在集合上的一次迭代中执行过滤方法。

至于数据结构,我想如果它是这样的:

如果我的过滤谓词完全是任意的,那么列表应该可以使用。

在一些非常有限和严格的值集的特定情况下,您可能会考虑树状结构或类似图形的结构,其中您可能有一些主节点,表示属性“property1”具有值“value1” 。如果你想删除“property1”值为“value1”的所有项目,你可以告诉主节点删除他的所有子节点(并且他们应该将自己从他们可能拥有的任何其他父节点中分离出来)。

答案 3 :(得分:0)

排序列表数据结构

如果您自己构建列表,可以考虑使用sorted数据结构。它将为您提供最佳搜索性能(log n复杂性,因此速度非常快。)

链接列表数据结构

LinkedList为您提供恒定的时间元素删除,但随机访问不具有恒定的复杂性(缓慢)。

如果LinkedList或排序列表对您的方案更快,则必须进行基准测试。

答案 4 :(得分:0)

如果您的元素是int s,我认为位设置将是此任务的最快数据结构。迭代将比通过数组列表稍慢(即使不是标准java.util.ArrayList,只有原始特化),但删除操作几乎没有任何成本,而从任何数组列表中删除都非常昂贵。

注意,通过直接使用long[]作为位设置并手动执行按位操作,您可以获得更多收益,因为java.util.BitSet不是非常注重性能的。但是,有道理,从BitSet开始。