pyt*_*nic 9 c++ performance multithreading x86-64 thread-synchronization
与无争议的原子变量(例如C++的原子<>)操作相比,它的速度/速度更快/更慢.此外,相对于无争议锁定,有争议的原子变量有多慢?我正在研究的架构是x86-64.
edA*_*a-y 15
我碰巧有很多低水平的速度测试.然而,速度意味着什么是非常不确定的,因为它很大程度上取决于你究竟在做什么(甚至与操作本身无关).
以下是AMD 64位Phenom II X6 3.2Ghz的一些数字.我也在英特尔芯片上运行它,时间变化很大(再次,具体取决于正在做什么).
GCC __sync_fetch_and_add是一个完全围栏的原子添加物,平均为16ns,最小时间为4ns.最短时间可能更接近事实(尽管我有一点开销).
无争议的pthread互斥(通过boost)是14ns(这也是它的最小值).请注意,这也有点太低,因为如果其他东西锁定了互斥锁,时间实际上会增加,但现在不是无争议(因为它会导致缓存同步).
失败的try_lock是9ns.
我没有一个普通的原子公司,因为在x86_64上这只是一个正常的交换操作.可能接近最小可能时间,所以1-2ns.
在条件变量上没有服务员的情况下调用通知是25ns(如果有什么东西在等待大约304ns).
但是,由于所有锁定都会导致某些CPU排序保证,因此您修改的内存量(适用于存储缓冲区)将改变此类操作所需的时间.显然,如果你曾经在互联网上争论过最糟糕的时间.即使没有实际发生线程切换,任何返回linux内核的时间都可能是几百纳秒.这通常是原子锁执行的地方,因为它们不涉及任何内核调用:您的平均案例性能也是最糟糕的情况.如果有等待线程,互斥锁解锁也会产生开销,而原子则不会.
注意:进行此类测量充满了问题,因此结果总是有点可疑.我的测试试图通过固定CPU速度,设置线程的cpu亲和性,不运行其他进程以及对大型结果集求平均来最小化变化.
| 归档时间: |
|
| 查看次数: |
2222 次 |
| 最近记录: |