Loops 循环次数较多/较少但O(1)运算次数相同的算法的性能

Loops 循环次数较多/较少但O(1)运算次数相同的算法的性能,loops,optimization,time-complexity,Loops,Optimization,Time Complexity,每当我看到算法优化,我就会看到很多关于减少循环数的讨论。我经常看到多个操作被合并到一个循环中,而这个循环最初是单独完成的 最终,执行相同数量的O(1)过程。只是一个算法将它们分割成多个迭代。从扩展的角度来看,合并操作是否真的有性能优势 过于简化的例子。我知道这不是一个很好的例子,因为内部时间复杂度操作比甚至递增I的操作要低,但是你明白我的意思了 let tally1 = 0 let tally2 = 0 for (let i = 0; i < 10; i++) { tally1 +=

每当我看到算法优化,我就会看到很多关于减少循环数的讨论。我经常看到多个操作被合并到一个循环中,而这个循环最初是单独完成的

最终,执行相同数量的O(1)过程。只是一个算法将它们分割成多个迭代。从扩展的角度来看,合并操作是否真的有性能优势

过于简化的例子。我知道这不是一个很好的例子,因为内部时间复杂度操作比甚至递增
I
的操作要低,但是你明白我的意思了

let tally1 = 0
let tally2 = 0

for (let i = 0; i < 10; i++) {
  tally1 += 1
}

for (let i = 0; i < 10; i++) {
  tally2 += 1
}

// vs

for (let i = 0; i < 10; i++) {
  tally1 += 1
  tally2 += 1
}
让计数1=0
让高度2=0
for(设i=0;i<10;i++){
塔利1+=1
}
for(设i=0;i<10;i++){
高度2+=1
}
//vs
for(设i=0;i<10;i++){
塔利1+=1
高度2+=1
}

很明显,第二个版本的性能会更好,因为构成循环的所有操作只需执行一次

因此,虽然在循环内执行的操作不会更好或更差,但总体执行时间会更短

这是否相关在很大程度上取决于循环中的操作有多昂贵。如果它们便宜,那么循环的开销将是显而易见的,并且可能值得优化代码。如果它们很昂贵,可能不值得付出努力


除了性能,代码的清晰性也是一件好事。因此,如果从性能角度看这无关紧要,那么您应该选择更易于阅读的代码。

很明显,第二个版本的性能会更好,因为构成循环的所有操作只需执行一次

因此,虽然在循环内执行的操作不会更好或更差,但总体执行时间会更短

这是否相关在很大程度上取决于循环中的操作有多昂贵。如果它们便宜,那么循环的开销将是显而易见的,并且可能值得优化代码。如果它们很昂贵,可能不值得付出努力


除了性能,代码的清晰性也是一件好事。因此,如果从性能角度看这无关紧要,那么您应该选择更易于阅读的代码。

在非常短的循环中,循环构造本身的开销(增量和终止测试)是“显著的”。编译器可能会执行“循环展开”优化,即复制循环体以避免执行中间测试(在处理终止时要格外小心)

循环合并可以带来类似的加速

当循环体更加复杂时,循环开销变得更加微不足道,并且在合并循环时性能甚至会下降,因为可能会使所需寄存器的数量饱和或降低缓存效率


对于普通程序来说,这些类型的微优化通常不值得付出努力。它们与开发通用的可重用代码(如BLAS例程)更相关。

在非常短的循环中,循环构造本身的开销(增量和终止测试)是“显著的”。编译器可能会执行“循环展开”优化,即复制循环体以避免执行中间测试(在处理终止时要格外小心)

循环合并可以带来类似的加速

当循环体更加复杂时,循环开销变得更加微不足道,并且在合并循环时性能甚至会下降,因为可能会使所需寄存器的数量饱和或降低缓存效率


对于普通程序来说,这些类型的微优化通常不值得付出努力。它们与开发通用的可重用代码(如BLAS例程)更相关。

是的,你所描述的是我困惑的根源。我的想法是,枚举表中非常复杂的算法并不能以一种有意义的方式来证明意大利面条代码的合理性。我刚才所描述的是对你答案的准确评估吗?我会说是的。是的,你所描述的是我困惑的根源。我的想法是,枚举表中非常复杂的算法并不能以一种有意义的方式来证明意大利面条代码的合理性。我刚才所描述的是对你答案的准确评估吗?我会说是的。