c++ - 使用 -std=gnu++11 时发现了哪些已知的性能差异

标签 c++ gcc c++11 g++ profiling

我一直在研究一种遗传算法,我以前使用带有参数的 g++ 4.8.1 进行编译

CCFLAGS=-c -Wall  -Ofast -fopenmp -mfpmath=sse -march=native -std=gnu++11 

我没有使用 c++11 的许多特性,并且有一个合理的分析系统,所以我替换了 3-4 行代码并让它在没有 -std=gnu++11 的情况下编译

CCFLAGS=-c -Wall  -Ofast -fopenmp -mfpmath=sse -march=native

当我再次运行我的分析器时,我注意到我几乎可以在所有地方看到约 5% 的性能提升,除了我的排序功能,它现在需要大约两倍的时间。 (这是对象上的重载运算符<)

我的问题是:

这两个版本之间有哪些已知的性能差异,是否预计 c++11 在较新的编译器中会更快?

我也期待我正在使用 -Ofast 的事实正在发挥作用,我的假设是否正确?

更新:

按照评论中的建议,我使用和不使用 -march=native 再次运行测试

// Fast sort, slightly slower in other tests
CCFLAGS=-c -Wall  -Ofast -fopenmp -mfpmath=sse -march=native -std=gnu++11  

// Fast sort, slower in other tests
CCFLAGS=-c -Wall  -Ofast -fopenmp -mfpmath=sse -std=gnu++11  

// Slow sort, slower in other tests
CCFLAGS=-c -Wall  -Ofast -fopenmp -mfpmath=sse                     

// Slow sort, fastest in other tests
CCFLAGS=-c -Wall  -Ofast -fopenmp -mfpmath=sse  -march=native

结论似乎与 -std=gnu++11 大幅加快排序速度几乎相同,但几乎在其他任何地方都会受到轻微惩罚。 -march=native 在使用时加速程序。

鉴于这种排序每代只调用一次,我将利用不使用 -std=gnu++11 进行编译的速度优势,但我仍然对导致这些结果的原因非常感兴趣。

我正在使用 #include 提供的//std::sort

最佳答案

我不确定为什么使用 --std=gnu++11 会使部分代码变慢。我个人不使用它(相反,我使用 --std=c++11)。也许额外的 GNU 功能正在减慢速度?更有可能的是,优化还没有 catch 新的语言特性。

至于为什么排序部分更快,我有一个似是而非的解释:

您已启用移动语义。即使您自己没有明确地编写它们,如果您的类构造合理,它们也会被生成。 “排序”算法可能会利用它们。

但是,您上面列出的类似乎没有太多存储空间。但是,它没有“交换”方法,因此没有 C++11 移动语义,排序例程必须做更多的工作。你可以看看 this question and answers有关排序和移动语义以及与编译器选项交互的更多信息。

关于c++ - 使用 -std=gnu++11 时发现了哪些已知的性能差异,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22052218/

相关文章:

c++ - 编译c++文件时出错: Undefined symbols

gcc - GCC为x86生成的 “push %ebp; movl %esp, %ebp”有什么用途?

c++ - 为提供不同接口(interface)的容器包装容器

C++:使一个矩阵指向另一个矩阵

c++ - 通过系统变量设置QT基目录

C: 使一个类型与任何其他类型不兼容

c++ - 在 R 值中使用 volatile 两次

C++11 树上的异步操作

c++ - 我如何理解我的 valgrind 错误消息?

c++ - 有人可以解释递归在查找所有子集时的工作原理吗?