JavaScript替换回调 - 性能问题

时间:2010-03-18 22:28:05

标签: javascript regex performance optimization

在JavaScript中,您可以在regex字符串替换操作中定义回调处理程序:

str.replace(/str[123]|etc/, replaceCallback); 

想象一下,你有一个字符串和替换的查找对象。

var lookup = {"str1": "repl1", "str2": "repl2", "str3": "repl3", "etc": "etc" };

和这个回调函数:

var replaceCallback = function(match) { 
  if (lookup[match])
    return lookup[match]; 
  else
    return match;
}

您如何评估上述回调的表现?有没有可靠的方法来改善它?会

if (match in lookup) //....

甚至

return lookup[match] || match;

为JS编译器带来了优化的机会,还是一切都是一样的?

2 个答案:

答案 0 :(得分:6)

+1给Annie关于性能基准测试。

但我会选择

return lookup[match] || match;

它不仅仅是对属性的单一检索(而不是 - 禁止优化 - 两个,如前面的示例中所示),但它也更短(并且对于更短的代码并不总是如此)更清楚任何半职经验的JavaScript编码器。它会倾向于抛弃一些新手,但是你想要教新手的第一件事就是特殊的(和优秀的)||&&如何在JavaScript中工作,所以......

在某些实现中,它也适用于几个(非常)边缘情况。 (示例:'toString' in {}应为true [所有对象都从toString原型继承Object,但在Microsoft的JScript中为false。)

关于优化:除非明显明显(不要让你的循环条件成为必须计算事物的函数,如果它可以是不变的,避免不必要地重复查找),甚至没有关于它是否值得担心的一般讨论在您看到问题之前(有时称为“过早优化”),对于一般Web来说,JavaScript尤其如此。不同的微优化在不同的实现中有不同的结果,有时会产生冲突的结果(“A”在Internet Explorer中更好,但在FireFox中更糟糕,反之亦然)。大多数情况下,只要等到你看到一个特定的问题,然后解决这个特定的问题。

我更喜欢简单明了,除非我有充分的理由相信笨拙的东西会给我一个可衡量的,真实世界的改进。

答案 1 :(得分:5)

您可以使用JSLitmus等基准工具来衡量不同的方法。一定要测试不同的浏览器。