为什么使用array.map(String.fromCharCode)这个方法非常慢?

7

当我阅读Guido van Rossum的文章《一个优化趣谈》时,这个想法开始了。

决定在JavaScript中尝试同样的事情,我计时了以下内容:

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

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

我计时了一下,这个方法比之前的版本慢了约100倍。为什么?

以某种方式直接将此本地函数传递给Array.map()比将其包装在另一个函数中并将其传递给Array.map()要慢得多。

  • 它不是特定于浏览器的:在Chrome、Firefox和Opera中进行了测试。

  • 它不特定于map():尝试使用forEach(),其行为类似。

  • 它不特定于内置函数:尝试使用Math.round()和Math.sin() - 结果如预期:直接将函数传递给Array.map()比使用中间匿名函数稍快。

似乎问题出在String.fromCharCode上。

这里发生了什么?

PS. 最初在Hacker News thread中提出了这个问题,但由于相关文章是关于Python的,所以我认为在这里发布可以让更多的JavaScript开发人员看到。对于交叉发布表示抱歉。

1个回答

7

我自己找到了解决方法。

问题在于 String.fromCharCode() 接受多个参数,而 Array.map() 也将多个参数传递给回调函数。因此,下面的代码:

numbers.map(String.fromCharCode);

实际上等同于:

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

这很明显说明了为什么它运行缓慢,此外还有一些漏洞问题。


1
我正要发布与此相同的答案。由于 String.fromCharCode 从传入的所有参数构造返回的字符串(在这种情况下,仅使用前两个传入的参数,因为第三个不是数字),所以期望的结果是不同的。 - Andy E

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接