【发布时间】:2011-12-20 17:07:01
【问题描述】:
我正在尝试比较原始指针、boost shared_ptr 和 boostweak_ptr 之间的性能。在取消引用部分,我预计 shared_ptr 和 raw_ptr 是相等的,但结果显示 shared_ptr 的速度大约是原来的两倍。对于测试,我正在创建一个带有指向 int 的指针或共享指针的数组,然后在这样的循环中取消引用:
int result;
for(int i = 0; i != 100; ++i)
{
for(int i = 0; i != SIZE; ++i)
result += *array[i];
}
测试的完整代码可以在这里找到: https://github.com/coolfluid/coolfluid3/blob/master/test/common/utest-ptr-benchmark.cpp
可以在此处找到不带断言的优化构建的测试时间: http://coolfluidsrv.vki.ac.be/cdash/testDetails.php?test=145592&build=7777
感兴趣的值是“DerefShared time”和“DerefRaw time”
我猜这个测试可能存在某种缺陷,但我没有弄清楚差异来自哪里。分析显示来自 shared_ptr 的 operator* 被内联,它似乎需要更多时间。我仔细检查了 boost 断言是否关闭。
如果有人能解释差异可能来自哪里,我将非常感激。
额外的独立测试: https://gist.github.com/1335014
【问题讨论】:
-
+1,前几天我也在考虑这个问题。
-
缓存效果? shared_ptr 比原始指针大,因此您的数组将覆盖更多缓存行并需要更长的时间来读取。
-
您在什么平台上运行这些测试?
-
为什么是指针数组?你不应该多次取消引用 same 指针吗?
-
@BartJanssens:我会通过的。定期批评比建设性批评更容易。 ;-)
标签: c++ boost shared-ptr