多重循环,地址偏移小且次数多的循环放到内层
【说明】 对于多维数组来说,其低维的地址偏移小,如果以此为循环内层,可以提升缓存的利用率。对于for循环,内层循环更多,则展开的语句执行的次数更少。
【原理】 通过减少执行语句,提升数据局部性来提升运行效率。
【注意事项】 只在各层循环次数相差很大的情况下,需要考虑循环层次次序,若相差不大,则更应该照顾指令/数据等其他因素,甚至优先考虑可维护性等非性能维度。【案例】
优化前:
for (j = 0; j < 1000; j++) { // j<1000和j++相关代码分别执行1000次
for (i = 0; i < 10; i++) { // 1)i = 0代码执行1000次;2)i<10和i++相关代码分别执行10\*1000次
sum += a[i][j]; // sum += a[i][j]代码执行10\*1000次
}
}
优化后:
for (i = 0; i < 10; i++) { // i<10和i++相关代码分别执行10次
for (j = 0; j < 1000; j++) { // 1)j = 0代码执行10次;2)j<1000和j++相关代码分别执行1000*10次
sum += a[i][j]; // sum += a[i][j]代码执行1000*10次
}
}
说明 :可见内层循环越多,执行的语句更少;同时,由于C/C++语言数组是行优先顺序存储,如果按照第二种方式遍历,由于后续的16个数组(以cacheline=64Byte为例)元素都加载到了cache中,可以显著提升运行效率。
父主题: 控制语句