我一直在研究一种遗传算法,我以前使用带有参数的 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/