Java 有效插入到长值集合中
我正在为一段代码进行度量收集,并希望存储一组时间差(键入primitiveJava 有效插入到长值集合中,java,collections,guava,Java,Collections,Guava,我正在为一段代码进行度量收集,并希望存储一组时间差(键入primitivelong)以供以后分析 此集合的insert操作应尽可能高效,以便为结果增加最少的开销 我首先测试了一个ConcurrentLinkedQueue集合。这导致了最差的性能(可能是装箱/拆箱造成的) 我目前决定使用一个同步的gnu.trove.TLongArrayList,对于500万长的数据集来说,它的速度快了近7倍 对于其他藏书库的任何建议,如果这些藏书库可能是这个用例的良好基准,我们将不胜感激。我看了番石榴API,但似
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是一项要求,因为测试的代码是多线程的。不必将所有值保存在一个集合中。请随意建议其他数据结构。无需拆除。在结果分析过程中,读取发生在测试后,所以它们的效率是不相关的。你能不能也发布一些数字?例如,当你说它有“最差的性能”时,花了多长时间?小时、分钟、秒?取决于竞争的程度,这可能是一场非常大的胜利。取决于竞争的程度,这可能是一场非常大的胜利。