代码之家  ›  专栏  ›  技术社区  ›  Tomalak

JavaScript替换为回调-性能问题

  •  10
  • Tomalak  · 技术社区  · 14 年前

    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 回复  |  直到 14 年前
        1
  •  6
  •   T.J. Crowder    14 年前

    +向安妮介绍性能基准。

    return lookup[match] || match;
    

    它不仅只是对属性的一次检索(而不是——除非优化——如前面的示例所示,两次),而且它还很短(对于较短的代码并不总是这样) 更清晰 任何半熟经验的JavaScript程序员。它会倾向于给新手扔一点东西,但你首先要教新手的是如何特别(和优秀) || && 使用JavaScript,所以。。。

    在一些实现中,它还可以解决一些(非常)边缘的情况(例子: 'toString' in {} 应该是 true [所有对象继承 toString Object 但它是 false

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

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

        2
  •  5
  •   Annie    14 年前

    您可以使用像 JSLitmus 以不同的方法为基准。一定要测试不同的浏览器。