高效插入长值集合

时间:2011-07-05 09:40:19

标签: java collections guava

我正在为一段代码进行指标收集,并希望存储一组时差(类型原始long)以供以后分析

此集合的插入操作应尽可能高效,以便为结果添加最少的开销。

我首先测试了一个ConcurrentLinkedQueue<Long>集合。这给出了最糟糕的表现(可能是由于拳击/拆箱)

我目前已决定使用 synchronized gnu.trove.TLongArrayList,对于500万条长度的数据集,这几乎要快7倍。

对于可能是本用例基准测试的其他馆藏库的任何建议都将不胜感激。我看了一下guava API,但似乎找不到任何东西

5 个答案:

答案 0 :(得分:3)

您可以采取的改善性能的方法是减少数据类型的大小。如果你可以将它减少到int,那会有所帮助。 (通常两次调用nanoTime()之间的差异小于20亿)

您可以为集合设置良好的起始大小。如果你知道你可能有多少,请特别注意。

如果您知道要记录的最大值数,则可以使用int[],如果未达到最大值,则可以使用counter。这比使用Object更快。

答案 1 :(得分:3)

有一个新版本的Trove正在筹备中(最新版本是3.0.0-RC2)。 This page说Trove 3比Trove 2快10%到20%。

不幸的是:

  • Trove 3具有API兼容性更改。
  • 在线javadoc尚不可用。
  • 你还不能从Maven Central获得它。 (你甚至不能得到Trove 2.1.0 ... tsk,tsk。)

答案 2 :(得分:2)

您应该尝试fastutil。取决于场景,fastutil可能比trove4j更快

答案 3 :(得分:1)

我不确定您的情况是否允许这样做,但您是否考虑将数据保存在每个线程的单独的,不同步的数据结构中?类似于包含TLongArrayList的ThreadLocal。这将消除同步开销。

答案 4 :(得分:0)

如果您事先知道集合的大小,则可以使用单个未同步的long[]数组与AtomicInteger计数器相结合来获取下一个插入位置。