JavaScript替换回调 - 性能问题

Tom*_*lak 10 javascript regex optimization performance

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

str.replace(/str[123]|etc/, replaceCallback); 
Run Code Online (Sandbox Code Playgroud)

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

var lookup = {"str1": "repl1", "str2": "repl2", "str3": "repl3", "etc": "etc" };
Run Code Online (Sandbox Code Playgroud)

和这个回调函数:

var replaceCallback = function(match) { 
  if (lookup[match])
    return lookup[match]; 
  else
    return match;
}
Run Code Online (Sandbox Code Playgroud)

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

if (match in lookup) //....
Run Code Online (Sandbox Code Playgroud)

甚至

return lookup[match] || match;
Run Code Online (Sandbox Code Playgroud)

导致JS编译器优化的机会,还是一切都是一样的?

T.J*_*der 6

+1安妮关于性能基准测试.

但我会一起去

return lookup[match] || match;
Run Code Online (Sandbox Code Playgroud)

它不仅是财产的只是一个单一的检索(而不是-禁止优化-二,在你前面的例子),但它也短,(这并不总是短码真)更清晰的任何半经验JavaScript编码器.它会倾向于抛弃一些新手,但是你想要教新手的第一件事就是JavaScript中的特殊(和优秀)||&&工作方式,所以...

在某些实现中,它还可以解决几个(非常)边缘情况.(示例:'toString' in {}应该是true[所有对象都继承toStringObject原型],但它是false在Microsoft的JScript中.)

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

我更喜欢简单和清晰,除非我有充分的理由相信笨重的东西会给我一个可衡量的,真实世界的改进.


Ann*_*nie 5

您可以使用JSLitmus等基准工具来对不同的方法进行基准测试.一定要测试不同的浏览器.