Javascript toLowerCase()性能与变量创建

时间:2011-07-15 11:03:36

标签: javascript performance

什么更有效?:

var text="ABCdef";
var lowerVersion=text.toLowerCase();
if (lowerVersion=='abcdef' || lowerVersion=='asdfgh' || lowerVersion=='zxcvbn'){...

var text="ABCdef";
if (text.toLowerCase()=='abcdef' || text.toLowerCase()=='asdfgh' || text.toLowerCase()=='zxcvbn'){...

即。变量创建比运行toLowerCase()几次更昂贵吗?

感谢。

4 个答案:

答案 0 :(得分:2)

这是JavaScript。答案将是:取决于。这取决于您使用的引擎,数据,上下文中的其他内容,第一个或最后一个匹配是否匹配,星期二...

但是在JavaScript中创建变量非常快。相反,重复调用版本要求解释器进行多个函数调用,并且与大多数其他操作相比,函数调用(通过任何实际测量快速调用)都很慢。唯一可行的方法就是解释器可以找出它可以缓存调用的结果,这很棘手。

Taking @Felix's performance test and making it pessimistic(例如,最糟糕的情况,但没有一个匹配)表明,即使Chrome无法对其进行足够的优化,也不会使重复的函数调用变得更糟。我没有做任何全面的测试,但是Chrome,Firefox和Opera都出现了大约60%的速度。

当然,你有另一种选择:

var text="ABCdef";
switch (text.toLowerCase()) {
  case 'abcdef':
    // ...
    break;
  case 'asdfgh'
    // ...
    break;
  case 'zxcvbn'
    // ...
    break;
}

所有这些都是过早的优化,但这种情况一般都很糟糕,但是对于JavaScript以及运行复杂的各种环境而言尤其糟糕。

更好的问题是:什么更清晰,更易于维护?

答案 1 :(得分:1)

Caching seems faster,这似乎是合乎逻辑的(3 toLowerCase调用vs 1)。但我不认为它会影响很多,如果它是一次或几次操作。这可能是一个品味问题,但我认为分配变量更具可读性/可维护性。

答案 2 :(得分:1)

毫无疑问,第二次实施将比第一次实施快得多。

可以肯定的是,每次text.toLowerCase()花费时间O(n)时会有3xO(n) vs O(n)

我在jsPref.com上运行了测试,第二个片段的速度提高了18%。

答案 3 :(得分:1)

如果要多次引用该值,请将其存储为变量:toLowerCase()对于长字符串可能会非常慢。