【问题标题】:JavaScript replace with callback - performance questionJavaScript 替换为回调 - 性能问题
【发布时间】:2011-01-29 05:57:35
【问题描述】:

在 JavaScript 中,您可以在正则表达式字符串替换操作中定义回调处理程序:

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 编译器带来了优化的机会,还是一回事?

【问题讨论】:

    标签: javascript regex performance optimization


    【解决方案1】:

    您可以使用像 JSLitmus 这样的基准测试工具来对不同的方法进行基准测试。请务必测试不同的浏览器。

    【讨论】:

    • 是的,这就是务实的做法。我一直在寻找一些关于 JS 如何处理这个问题的深入的大师知识。我很欣赏它可能过于特定于实现而无法给出笼统的答案。
    【解决方案2】:

    +1 就性能基准向 Annie 提出建议。

    但我会选择

    return lookup[match] || match;
    

    它不仅只是对属性的一次检索(而不是像您之前的示例中那样——禁止优化——两次),而且它也更短并且(对于更短的代码并不总是如此)对任何经验不足的 JavaScript 编码人员来说都更清楚。它往往会让新手有点难受,但您首先要教给新手的一件事是特殊(和优秀)||&& 如何在 JavaScript 中工作,所以...

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

    关于优化:除非是显而易见的(不要让你的循环条件成为一个函数,如果它可以是一个不变量,就必须去计数,避免不必要地重复查找),即使没有关于是否值得担心的一般性讨论在您发现问题之前(有时称为“过早优化”),对于一般 Web 的 JavaScript 尤其如此。不同的微优化在不同的实现中会产生不同的结果,有时会产生冲突的结果(“A”在 Internet Explorer 中更好,但在 FireFox 中更差,反之亦然)。主要是等到你看到一个特定的问题,然后解决这个特定的问题。

    我更喜欢简洁明了,除非我有充分的理由相信更笨重的东西会给我带来可衡量的现实改进。

    【讨论】:

    • +1 随着对象成员查找的进行,编译器很可能能够将其优化为单个调用,即使在 if ... 变体 (?) 中也是如此。这正是我想知道的。 P.S.:我很清楚这相当一些微观管理。它核心的学术问题。
    • @Tomalek:我不会指望它,一些实现令人震惊地未经优化。在那些(例如,Chrome 非常快)中,您几乎可以摆脱任何事情。 :-) 所以你担心那些慢的,如果你看到它们。
    • 如果将函数的 if/else 版本粘贴到 Closure 编译器中,它会吐出 T.J. 的版本——所以我猜想 JS 解析器可能能够进行相同的优化。不确定。链接到编译器,以便您自己尝试:closure-compiler.appspot.com
    • @Annie:是的,但同样,你不能假设实现已经优化到那个程度。有些是。谷歌当然是。根据我的经验,有些确实不是。 (对于潜伏者:Closure 编译器和 Chrome 的 V8 JavaScript 引擎 - freaky 快 - 都来自同一个人,谷歌的好人对快速的网络应用程序有着重大的既得利益.)
    • @Annie:哇,闭包编译器很整洁。谢谢你:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-06-22
    • 2012-08-04
    • 1970-01-01
    • 2010-10-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多