c++ - http ://tinyurl. com/pzpyvb9 处的无锁堆栈的性能数据是否真实?

标签 c++ multithreading performance benchmarking lock-free

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/

相关文章:

c# - 通过 IntPtr 循环?

C++ - 基类和私有(private)头文件

java - 是什么让 android 4.1.X 的加载速度变慢而不是 4.2?

java - Spring Boot Async方法如何使用ThreadPool处理请求

c - Linux C++ : test of the cacheline size performance effect not as expected

Mysql 删除索引非常慢

c++ - 在表格中格式化输出,C++

c++ - 模数不返回数字的余数

c# - 如何学习线程安全的c#编程?

.net - 在 .NET 中的多线程上快速、高效地处理 HTTP 请求