首页 > 解决方案 > 有没有办法在循环内使用静态 if 语句来节省处理周期?

问题描述

考虑这个代码片段:

var x = 10;
for (var i=0; i<100; i++) {
    if (x === 10) {
        /* do some stuff */
    }
}

if 语句中的条件是静态的,除了x,它的值在进入循环之前只计算一次。这个值可以来自任何地方——它可以是硬编码的、用户的输入、数学问题的结果等。关键是一旦x被评估,它就不会改变。因此,if 语句中的条件在每次循环迭代时都是相同的,但是代码仍然清楚地评估了条件,从而在过程中浪费了处理周期。有没有办法让条件评估一次,然后让每次迭代立即执行正确的代码分支?

标签: javascript

解决方案


一种选择是提前保存条件,这样就不需要x每次都重新检查:

var x = 10;
var doCondition = x === 10;
for (var i=0; i<100; i++) {
    if (doCondition) {
        /* do some stuff */
    }
}

另一种选择是有两个单独的函数,一个用于是否满足条件,一个用于不满足条件。它会是 WET,但条件只会被评估一次。例如,你可以转

var x = 10;
var doCondition = x === 10;
for (var i=0; i<100; i++) {
    if (doCondition) {
        /* do some stuff */
    } else {
        // do some other stuff
    }
}

进入

const fns = {
  trueCond() {
    for (var i=0; i<100; i++) {
      // do some stuff
    }
  },
  falseCond() {
    for (var i=0; i<100; i++) {
      // do some other stuff
    }
  }
  // insert other conditions here, if you want
  // could also just use if/else statements containing loops,
  // rather than an object of functions
};
const fn = x === 10 ? fns.trueCond : fns.falseCond;
fn();

这取决于循环的复杂程度/正在执行的其他操作。

尽管如此,这几乎总是过早优化的情况——如果您担心性能,请先运行性能测试,如果您发现速度很慢,请确定代码较慢的区域并改进它。循环中的条件可能不会是最慢的区域。


推荐阅读