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