语境:
我目前正在调查我的团队当前的构建环境(仍然使用 gcc-4.1.2)和使用 gcc-4.8.1 的构建之间的性能提升。结果令人震惊,在一次回归中加权平均速度至少提高了 25%。我还使用 gcc-4.4.7 进行了另一项测试,但它只看到了大约 7% 加速的加权平均值。我推测大的差异与新的 C++11 复制/移动语义有关,因为内存事务是我们程序中相当大的瓶颈。我们广泛使用了 STL 类型,所以编译器可能很好地利用了他们新的移动构造函数。
为了验证我的说法,我选择了一个显示平均性能改进的测试,并在其上运行了 kcachegrind 以进行两次编译。结果发布在下面,与我预期的不太一样。我应该指出一个快速且可能相关的细节。由于官僚主义的原因,我不得不静态编译 gcc-4.8.1 的 libstdc++.so。这意味着 kcachegrind 的位置显示了一些我为安全起见已审查的私有库。
令我惊讶的是,对内存操作的调用量相对没有变化(malloc
和_int_malloc
)。另一个有趣的结果是完全不存在memcpy
和增加_memcmp_sse4_1
.
问题:
如果我想验证我的假设,即 C++11 语义是提高性能的原因,我应该在 callgrind 图中寻找什么?我应该找到更少的内存访问,还是应该找到std::string(string&&)
签名(我实际上在这里找不到)。请记住,这是用 编译的-O3
,这可能意味着此类签名已被优化,因此我进退两难。
我很高兴报告如此大的性能提升,但我想了解这种性能的来源。让我知道是否需要报告更多结果以获得更明确的答案。我希望这对 SO 来说不是太笼统的问题......