我一直想知道在更好地利用 CPU 缓存方面什么更有效(众所周知,这会受益于引用的局部性)——两个循环,每个循环都迭代相同的数学数字集,每个循环都有不同的主体语句(例如为集合的每个元素调用一个函数),或者有一个循环,其主体相当于两个(或多个)主体语句。在所有循环之后,我们假设相同的应用程序状态。
在我看来,有两个循环会引入更少的缓存未命中和驱逐,因为循环使用的更多指令和数据适合缓存。我对吗?
假设:
与循环的成本相比
f
,调用的成本可以忽略不计g
f
并g
单独使用大部分缓存,因此当一个又一个被调用时缓存会溢出(单循环版本的情况)英特尔酷睿双核 CPU
C语言源代码
GCC 编译器,“没有额外的开关”
如果可能的话,我想要“过早的优化是邪恶的”角色之外的答案。
我提倡的双循环版本的一个示例:
int j = 0, k = 0;
for(int i = 0; i < 1000000; i++)
{
j += f(i);
}
for(int i = 0; i < 1000000; i++)
{
k += g(i);
}