代码之家  ›  专栏  ›  技术社区  ›  Rene Saarsoo

为什么array.map(String.fromCharCode)这么慢?

  •  6
  • Rene Saarsoo  · 技术社区  · 14 年前

    An Optimization Anecdote .

    决定在JavaScript中尝试同样的方法,我计时如下:

    numbers.map(function(x){ return String.fromCharCode(x); });
    

    这已经相当快了,但是为什么不完全消除匿名函数并将String.fromCharCode直接传递给map():

    numbers.map(String.fromCharCode);
    

    我计时了。。。... 速度慢了大约100倍 比以前的版本。怎么会?

    不知何故,将这个本机函数直接传递给Array.map()要比将它包装在另一个函数中并传递给Array.map()慢得多。

    • 它并不特定于map():tried forEach(),其行为类似。

    • 它并不特定于内置函数:tryed Math.round()和Math.s in()-结果与预期的一样:直接将函数传递到Array.map()比使用中间匿名函数快一点。

    怎么回事?

    PS.最初提出这个问题 Hacker News thread

    1 回复  |  直到 14 年前
        1
  •  6
  •   Rene Saarsoo    14 年前

    我自己找到了解决办法。

    问题是String.fromCharCode()接受多个参数,Array.map()也将多个参数传递给回调。因此,代码:

    numbers.map(String.fromCharCode);
    

    实际上相当于:

    numbers.map(function(x, y, z){ return String.fromCharCode(x, y, z); });