我有二进制搜索树的无等待实现,但我无法找出测量线程争用的具体方法。通过争用,这里我的意思是尝试同时访问同一块内存的线程数。
到目前为止,我已经搜索了ThreadMXBean和ThreadInfo类,但由于没有涉及锁定,我还没有找到任何解决方案。
答案 0 :(得分:3)
没有办法衡量对内存位置的争用"没有过高的性能成本。直接测量(例如,正确同步的计数器包装所有访问)将引入人为瓶颈,这将破坏测试可靠性。
"同一时间"在您想要测量它的规模上松散定义,因为只有一个CPU"拥有"在给定时间内内存中的特定位置。在这种情况下,您可以做的最好的事情是测量CPU处理内存冲突的速率,例如:通过硬件计数器。这样做需要了解给定平台上的内存子系统。此外,HW计数器属性为机器(= CPU)状态,而不是内存状态;换句话说,您可以估计特定指令经历的冲突数,而不是访问给定内存位置的CPU数量。
答案 1 :(得分:1)
在争用来源中尝试该措施是错误的方法。争论的原因可能是什么?!
因此,首先,设置一个基准测试套件,在您的数据结构上运行典型的访问模式,并绘制不同线程数的性能图。这是一个很好的例子 nitro cache performance page
如果你几乎是线性的:恭喜,你已经完成了!
如果您不进行线性扩展,则需要更多洞察力。现在您需要将系统整体分析,看看原因是什么,例如用于CPU管道停顿。最好的方法是使用低开销跟踪。在Linux上,您可以使用OProfile。 OProfile还提供Java支持,可帮助您将JITed机器代码与Java程序相关联。