以下优化技术的名称是什么,为什么它比以前的实现更好?
const int size = 100;
int arr1[size];
int arr2[size];
从双循环
for(int i=0; i<size; ++i)
arr1[i] = 1;
for(int i=0; i<size; ++i)
arr2[i] = 1;
到单回路
for(int i=0; i<size; ++i) {
arr1[i] = 1;
arr2[i] = 1;
}
选项是;
维基百科将此优化称为循环融合。想法是,两个循环的循环控制流开销不会增加一倍。如果组合循环的内存访问模式较差,这可能对性能没有预期的影响,但是由于示例中的两个循环都按顺序访问了连续的内存块,因此硬件应该能够有效地对其进行处理。
在转换之前,每个循环都将执行此操作:
i
用0初始化。size
。i >= size
,请跳至8。arr1
数组开始的地址。arr1 + i
。i
一。然后立即再次:
i
用0初始化。size
。i >= size
,则跳到16。arr2
数组开始的地址。arr2 + i
。i
一。任何编译器可能要做的第一件事是将“加载常量size
”和“加载地址arr
”移出循环体。然而,总工作量与有用工作的比率不是很好。将此与组合循环进行比较:
i
用0初始化。size
。i >= size
,则跳至10。arr1
数组开始的地址。arr1 + i
。arr2
数组开始的地址。arr2 + i
。i
一。计算项目符号作为机器指令的度量标准并不是推理性能的最准确方法。您需要知道您的实际硬件支持哪些指令,才能实际比较所需指令的数量。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句