我有以下基准:https://gist.github.com/leifwalsh/10010580
从本质上讲,它会旋转k线程,然后每个线程执行大约1600万次/ k锁定/增量/解锁周期,使用自旋锁和a std::mutex.在OSX上,std::mutex当争用时,它比自旋锁慢得多,而在Linux上它具有竞争力或者更快.
OSX:
spinlock 1: 334ms
spinlock 2: 3537ms
spinlock 3: 4815ms
spinlock 4: 5653ms
std::mutex 1: 813ms
std::mutex 2: 38464ms
std::mutex 3: 44254ms
std::mutex 4: 47418ms
Run Code Online (Sandbox Code Playgroud)
Linux的:
spinlock 1: 305ms
spinlock 2: 1590ms
spinlock 3: 1820ms
spinlock 4: 2300ms
std::mutex 1: 377ms
std::mutex 2: 1124ms
std::mutex 3: 1739ms
std::mutex 4: 2668ms
Run Code Online (Sandbox Code Playgroud)
处理器是不同的,但没有那么不同(OSX是Intel(R)Core(TM)i7-2677M CPU @ 1.80GHz,Linux是Intel(R)Core(TM)i5-2500K CPU @ 3.30GHz),这看起来像库或内核问题.有人知道缓慢的根源吗?
为了澄清我的问题,我理解"有不同的互斥实现可以针对不同的事情进行优化,这不是问题,而是预期的".这个问题是:实现中导致这种情况的实际差异是什么?或者,如果这是一个硬件问题(也许缓存在macbook上只是慢得多),那也是可以接受的.