http://blog.memsql.com/common-pitfalls-in-writing-lock-free-algorithms/结尾David Stolp 显示了无锁堆栈的性能数据,表明无锁版本比受互斥体保护的顺序版本慢,即使争用增加也是如此。结果很有趣,但有两件事让我担心:
- 充其量,“总体吞吐量”会下降,然后随着线程数量的增加而趋于平稳。总吞吐量不应该随着线程数量的增加而增加吗?
- 在最终图表中,1 个线程的性能值范围约为 35M 到 55M。对于 1 个线程来说,这似乎是一个非常宽的范围(不能有任何争用)。
我试图找到一种方法来联系作者解决这些问题,但没有成功,所以我转向 SO 社区看看结果是否现实。是吗?
最佳答案
At best, "overall throughput" decreases and then levels out as the number of threads increases. Shouldn't overall throughput increase as the number of threads increases?
这很正常!堆栈只有一个!瓶颈是线程之间的内存同步,而不是代码执行。因此,如果更多线程填充堆栈,则会发生更多内存冲突(出现竞争条件),从而吞吐量降低。
In the final chart, the performance values for 1 thread range from about 35M to 55M. This seems like an awfully wide range for 1 thread (where there can't be any contention).
此测试代码不现实,因为它只是将节点弹出并插入堆栈。因此,相对较短的代码中的最小差异可以极大地影响吞吐量。
如果你检查代码,你会发现 SpinLock 版本非常简单,并且可能比 LockFree 更快,因为它是用 test_and_set
原子函数制成的,通常比原子 CAS
(比较和交换),用于 LockFree 版本。
编辑:
LockFree版本使用cmpxchg16b
,它是16字节CAS,而SpinLock仅使用8字节test_and_set函数(使用cmpxchg8b
实现),因此存在速度差异!
关于c++ - http ://tinyurl. com/pzpyvb9 处的无锁堆栈的性能数据是否真实?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19164342/