在this code sample中,我对pthread互斥锁的scoped vs手动锁定进行了基准测试。我期望这两种方法具有相同的性能。但令我惊讶的是,scoped lock解决方案看起来要快一点。
有人可以解释为什么会这样吗?
我正在使用g ++ 4.5.2并使用以下选项进行编译:
g++ -std=c++0x -O2 -o test main.cpp
当我在本地PC(而不是Ideone)上进行20亿次迭代时,我得到了更大的差异:
g++ -std=c++0x -O2 -o test main.cpp
scoped_lock: 10530ms
normal: 11290ms
scoped_lock: 10530ms
normal: 11280ms
scoped_lock: 10530ms
normal: 11280ms
scoped_lock: 10530ms
normal: 11290ms
我使用更高分辨率的时钟改进了程序:http://ideone.com/CMbuw。这次scoped锁有点慢。
我认为可以肯定地认为它是一种测量异常。
答案 0 :(得分:4)
我changed the iteration count to 50 millions(代码中有2千万),结果现在是
result: Time limit exceeded time: 5s memory: 2828 kB signal: 24 (SIGXCPU)
input: no
output:
scoped_lock: 740ms
normal: 740ms
scoped_lock: 710ms
normal: 710ms
scoped_lock: 720ms
normal: 720ms
完全相同。因此,我会在测试用例中归咎于测量错误 - 只是没有足够的代码迭代。如果你真的在乎你应该查看发出的机器代码。
答案 1 :(得分:0)
对于如此小的差异,我建议您阅读生成的汇编代码。也许编译器能够为基于范围的方法挤出一些指令,这些指令在手动操作时需要存在。
答案 2 :(得分:0)
抢先式多任务操作系统将处理器时间分配给各个进程。 (IANA操作系统程序员,所以请更正我)在Windows进程中(过去是?)给定60ms运行时间的“切片”。在每个片的末尾,或者如果进程通过等待自愿放弃其片,则更早或者更早,如果有另一个进程等待CPU,则第一个进程进入休眠状态,第二个进程被给予一个片。如果没有准备好运行的进程,那么第一个进程会立即进行另一个进程。
基本上,如果你正在进行任何非平凡的时间测试,那么任何少于几片的差异都是微不足道的。