我正在为一段代码进行指标收集,并希望存储一组时差(类型原始long
)以供以后分析
此集合的插入操作应尽可能高效,以便为结果添加最少的开销。
我首先测试了一个ConcurrentLinkedQueue<Long>
集合。这给出了最糟糕的表现(可能是由于拳击/拆箱)
我目前已决定使用 synchronized gnu.trove.TLongArrayList
,对于500万条长度的数据集,这几乎要快7倍。
对于可能是本用例基准测试的其他馆藏库的任何建议都将不胜感激。我看了一下guava API,但似乎找不到任何东西
答案 0 :(得分:3)
您可以采取的改善性能的方法是减少数据类型的大小。如果你可以将它减少到int
,那会有所帮助。 (通常两次调用nanoTime()之间的差异小于20亿)
您可以为集合设置良好的起始大小。如果你知道你可能有多少,请特别注意。
如果您知道要记录的最大值数,则可以使用int[]
,如果未达到最大值,则可以使用counter
。这比使用Object更快。
答案 1 :(得分:3)
有一个新版本的Trove正在筹备中(最新版本是3.0.0-RC2)。 This page说Trove 3比Trove 2快10%到20%。
不幸的是:
答案 2 :(得分:2)
您应该尝试fastutil。取决于场景,fastutil可能比trove4j更快
答案 3 :(得分:1)
我不确定您的情况是否允许这样做,但您是否考虑将数据保存在每个线程的单独的,不同步的数据结构中?类似于包含TLongArrayList的ThreadLocal。这将消除同步开销。
答案 4 :(得分:0)
如果您事先知道集合的大小,则可以使用单个未同步的long[]
数组与AtomicInteger
计数器相结合来获取下一个插入位置。