3

我有一个二叉搜索树的无等待实现,但我无法找出衡量线程争用的具体方法。这里的争用是指尝试同时访问同一块内存的线程数。

到目前为止,我已经搜索了 ThreadMXBean 和 ThreadInfo 类,但是由于没有涉及到锁,所以我还没有找到任何解决方案。

4

2 回答 2

3

如果没有高昂的性能成本,就无法衡量“内存位置”的争用。直接测量(例如,正确同步的计数器包含所有访问)将引入人为瓶颈,这将破坏测试的可靠性。

“同一时间”在您要测量的尺度上松散地定义,因为在给定时间内只有一个 CPU“拥有”内存中的特定位置。在这种情况下,您可以做的最好的事情是测量 CPU 处理内存冲突的速率,例如通过硬件计数器。这样做需要了解给定平台上的内存子系统。此外,机器(= CPU)状态的硬件计数器属性,而不是内存状态;换句话说,您可以估计特定指令经历了多少次冲突,而不是有多少 CPU 访问了给定的内存位置。

于 2014-05-13T12:21:58.070 回答
1

在争用源中尝试测量是错误的方法。到底是什么原因引起的争论?!

因此,首先,设置一个基准测试套件,该套件在您的数据结构上运行典型的访问模式,并绘制不同线程数的性能图表。这是 硝基缓存性能页面的一个很好的例子。

如果你的缩放几乎是线性的:恭喜,你完成了!

如果您不进行线性扩展,则需要更多洞察力。现在您需要将系统作为一个整体进行分析,并查看例如 CPU 流水线停止的原因。最好的方法是为此使用低开销跟踪。在 Linux 上,您可以使用OProfile。OProfile 还支持 Java,它可以帮助您将 JITed 机器代码与您的 Java 程序相关联。

于 2014-05-14T11:15:23.837 回答