Java 有效插入到长值集合中

Java 有效插入到长值集合中,java,collections,guava,Java,Collections,Guava,我正在为一段代码进行度量收集,并希望存储一组时间差(键入primitivelong)以供以后分析 此集合的insert操作应尽可能高效,以便为结果增加最少的开销 我首先测试了一个ConcurrentLinkedQueue集合。这导致了最差的性能(可能是装箱/拆箱造成的) 我目前决定使用一个同步的gnu.trove.TLongArrayList,对于500万长的数据集来说,它的速度快了近7倍 对于其他藏书库的任何建议,如果这些藏书库可能是这个用例的良好基准,我们将不胜感激。我看了番石榴API,但似

我正在为一段代码进行度量收集,并希望存储一组时间差(键入primitive
long
)以供以后分析

此集合的insert操作应尽可能高效,以便为结果增加最少的开销

我首先测试了一个
ConcurrentLinkedQueue
集合。这导致了最差的性能(可能是装箱/拆箱造成的)

我目前决定使用一个同步的
gnu.trove.TLongArrayList
,对于500万长的数据集来说,它的速度快了近7倍


对于其他藏书库的任何建议,如果这些藏书库可能是这个用例的良好基准,我们将不胜感激。我看了番石榴API,但似乎找不到任何你应该尝试的东西。根据场景的不同,fastutil可能比trove4j快,您应该试试。根据场景的不同,fastutil可能比trove4j更快。要提高性能,可以做的事情是减少数据类型的大小。如果您可以将其减少为
int
,则会有所帮助。(对nanoTime()的两次调用之间的差异通常小于20亿)

您可以为集合设置一个良好的起始大小。特别是如果你知道你可能有多少


如果知道要记录的最大值,如果未达到最大值,则可以使用
int[]
和可能的
计数器。这将比使用对象更快。

要提高性能,可以减少数据类型的大小。如果您可以将其减少为
int
,则会有所帮助。(对nanoTime()的两次调用之间的差异通常小于20亿)

您可以为集合设置一个良好的起始大小。特别是如果你知道你可能有多少


如果知道要记录的最大值,如果未达到最大值,则可以使用
int[]
和可能的
计数器。这比使用一个对象要快,

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

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

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

不幸的是:

  • Trove3具有破坏API兼容性的更改
  • 在线javadocs还不可用
  • 你还不能从Maven Central那里得到它。(你甚至无法获得Trove 2.1.0…tsk,tsk。)

Trove的新版本正在开发中(最新版本为3.0.0-RC2)。说Trove 3比Trove 2快10%到20%

不幸的是:

  • Trove3具有破坏API兼容性的更改
  • 在线javadocs还不可用
  • 你还不能从Maven Central那里得到它。(你甚至无法获得Trove 2.1.0…tsk,tsk。)

如果您提前知道集合的大小,则可以使用单个非同步的
long[]
数组与
AtomicInteger
计数器组合以获得下一个插入位置。

如果您提前知道集合的大小,则可以使用单个非同步的
long[]
array与
AtomicInteger
计数器组合以获得下一个插入位置。

为什么需要线程安全的数据收集?是否有必要将所有值保存在一个集合中?在插入过程中,您是否也尝试从集合中读取/删除?@Salman Thread safety是一项要求,因为测试的代码是多线程的。不必将所有值保存在一个集合中。请随意建议其他数据结构。无需拆除。在结果分析过程中,读取发生在测试后,所以它们的效率是不相关的。你能不能也发布一些数字?例如,你说它的性能最差“,花了多长时间?小时、分钟、秒?为什么需要线程安全的数据收集?是否有必要将所有值保存在一个集合中?在插入过程中,您是否也尝试从集合中读取/删除?@Salman Thread safety是一项要求,因为测试的代码是多线程的。不必将所有值保存在一个集合中。请随意建议其他数据结构。无需拆除。在结果分析过程中,读取发生在测试后,所以它们的效率是不相关的。你能不能也发布一些数字?例如,当你说它有“最差的性能”时,花了多长时间?小时、分钟、秒?取决于竞争的程度,这可能是一场非常大的胜利。取决于竞争的程度,这可能是一场非常大的胜利。