【发布时间】:2016-07-12 19:45:16
【问题描述】:
我正在尝试比较锁定和无锁定链表数据结构的性能。我已经为无锁链表实现了this 算法。这两个程序都是用 C 语言实现的。
我正在测试 4 个线程。每个线程有 1000 次插入操作。
我正在使用英特尔 PCM 工具来测量性能。
这是我的发现: 无锁:
Median of L3 Misses=1012699
Median of L2 Misses=1479741
Median of L3 Hits=484128
Median of L2 Hits=1797537
Median of Time=1.80696
Median of Cycles=5296042019
Median of IPC=1.536135
Median of Bytes Read=444423232
Median of Bytes Written=25414144
锁定:
Median of L3 Misses=711796.5
Median of L2 Misses=1517899
Median of L3 Hits=819408.5
Median of L2 Hits=2282527
Median of Time=0.244517
Median of Cycles=894265192
Median of IPC=0.8495695
Median of Bytes Read=174872576
Median of Bytes Written=24722912
锁定版本在除 IPC 之外的所有计数上都表现更好。这是应该发生的事情吗?还是 lock Free 数据结构应该表现更好?
如果是,那么使用无锁数据结构有什么好处? 任何帮助将不胜感激。
【问题讨论】:
-
转到此页面:stackoverflow.com/questions/33083270 在该页面上有一个 YouTube 视频链接,指向 CppCon 上关于无锁实现和权衡的演讲。视频分为两部分,第 2 部分的链接。所以,找到第 1 部分。视频总共大约 2 小时,但演讲者很有趣,而且非常了解他的东西
-
这个answer 可能会解释性能问题(争用)。无锁数据结构可能有助于避免昂贵的上下文切换。
-
您没有看到真正的问题。缓存命中率绝对可怕,这是现代处理器上传统链表的标准问题。这些旧论文忽略了一个非常重要的细节。不要使用它们。
标签: c multithreading linked-list profiling lock-free