Performance 在循环中调用'n'函数与每次调用一个函数进行'n'循环之间是否存在速度差异?
考虑以下两个示例:Performance 在循环中调用'n'函数与每次调用一个函数进行'n'循环之间是否存在速度差异?,performance,loops,language-agnostic,Performance,Loops,Language Agnostic,考虑以下两个示例: for (int i = 0; i < someValue; ++i) { function1(i); function2(i); } for(int i=0;i
for (int i = 0; i < someValue; ++i) {
function1(i);
function2(i);
}
for(int i=0;i
vs
for(int i=0;i
使用一种表单比使用另一种表单会有任何性能提升吗?(i)考虑比较是非常便宜的。< p>使用两个循环,你要增加编译器必须检查的次数的两倍(在每次迭代中检查i的值两次而不是一次)。加上额外的上下文切换(使你的流水线更频繁地被刷新)。 如果您的编译器执行循环展开,那么我认为您不会看到太多差异。如果您的系统具有超线程技术,并且函数使用不同的资源(内存、int、float与all int或all mem或all float),将它们放在同一个循环中会更快 性能差异的大小取决于您使用的编译器选项、函数需要的资源、管道的深度以及系统的基本架构
如果不使用任何性能调整技巧,单循环应该运行得更快。虽然,除非上循环索引是一个巨大的值,否则性能上的差异可能可以忽略不计(如果单个循环“更快”),但答案确实是,“它取决于”很多事情。一如既往,它取决于。这一次,它取决于函数本身 有一种情况下,2-loop变体可能更快。此时function2会导致function1需要的所有数据在CPU缓存中被覆盖,反之亦然。这样,每次调用其中一个函数时,都需要在缓存中重新建立它们的数据 OTOH,对于2个循环,function1的数据在第一个循环期间保留在缓存中,function2的数据在第二个循环期间保留在缓存中。这将显著加快速度。不利的一面是跳转、索引增量和检查的成本,但这可能并不明显
for (int i = 0; i < someValue; ++i) {
function1(i);
}
for (int i = 0; i < someValue; ++i) {
function2(i);
}