blu*_*lds 18 c c++ optimization gcc
使用最新的gcc编译器,我还需要考虑这些类型的手动循环优化,还是编译器会为我做好充分的处理?
Nor*_*sey 47
如果你的探查器告诉你循环有问题,那么,需要注意的是循环中的内存引用,你知道它在循环中是不变的,但编译器没有.这是一个人为的例子,将一个元素冒泡到数组的末尾:
for ( ; i < a->length - 1; i++)
swap_elements(a, i, i+1);
Run Code Online (Sandbox Code Playgroud)
您可能知道调用swap_elements
不会更改值a->length
,但如果定义swap_elements
在另一个源文件中,则编译器很可能不会.因此,提升a->length
循环计算是值得的:
int n = a->length;
for ( ; i < n - 1; i++)
swap_elements(a, i, i+1);
Run Code Online (Sandbox Code Playgroud)
在性能关键的内循环中,我的学生可以通过像这样的转换获得可测量的加速.
注意,没有必要提升计算n-1
; 任何优化编译器都能完全发现局部变量之间的循环不变计算.它的内存引用和函数调用可能更难.并且代码n-1
更明显正确.
正如其他人所指出的那样,在你进行分析并发现循环是一个真正重要的性能瓶颈之前,你没有任何业务可以做这些.
Jas*_*ams 18
编写代码,对其进行概要分析,并且只有在找到不够快的东西时才考虑优化代码,并且您无法想到可以首先减少/避免瓶颈的替代算法.
对于现代编译器,这个建议更为重要 - 如果您编写简单的干净代码,编译器的优化器通常可以更好地优化代码,而不是尝试给它时髦的"预优化"代码.