代码优化咨询:为何下述两段循环代码前者优化程度更高?
第一段代码优化程度更高的核心原因
- 循环展开减少固定开销
第一段采用了步长为2的手动循环展开策略,原本第二段需要跑1000次循环,每次都要做循环边界判断、循环变量自增操作,第一段只需要执行500次,直接将循环本身的固定开销降低了一半。
// 第一段代码:每次循环处理2个元素 for (i = 0; i < 1000; i+=2){ float var = numberOfEggs*arrayX[i] + arrayY[i]; arrayY[i+1] = var; arrayY[i+2] = numberOfEggs*arrayX[i+1] + var; }
- 消除冗余计算与重复内存访问
第一段将numberOfEggs*arrayX[i] + arrayY[i]的结果存入临时变量var,计算arrayY[i+2]的时候直接复用这个结果,不需要再重新计算,也不需要额外读取刚写入内存的arrayY[i+1]的值。
// 第二段代码:每次循环处理1个元素,存在串行依赖 for(long i = 0; i < 1000 ; ++i) arrayY[i+1] = numberOfEggs*arrayX[i] + arrayY[i];
而第二段的每一步计算都严格依赖上一步写入的arrayY值,不仅没有公共子表达式优化,还多了一倍的arrayY内存读操作。
- 寄存器复用提升读写效率
第一段的临时变量var一般会被编译器分配到CPU寄存器中,寄存器的读写延迟是内存的上百倍,比第二段每次都要读写内存数组的效率高很多。
另外需要注意:如果编译器没有开启自动循环展开优化,第一段手动优化的收益会更突出。即使编译器开启了自动展开优化,第一段手动完成的公共子表达式提取也能进一步降低计算和内存访问的开销。
内容的提问来源于stack exchange,提问作者Megan Darcy
相关产品推荐
相关产品推荐

