2010-11-02 79 views
5

当我读到Guido van Rossum的散文An Optimization Anecdote时,它开始了。为什么array.map(String.fromCharCode)这么慢?

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

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

这是相当快了,但为什么不能完全消除匿名函数,并直接传递使用String.fromCharCode映射():

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开发人员。对不起,交叉发帖。

回答

5

我自己找到了解决方案。

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

numbers.map(String.fromCharCode); 

其实就是等同的:

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

从中可以很明显它为什么这么慢。此外它也是越野车。

+1

我刚刚发布了相同的答案。预期的结果是不同的,因为'String.fromCharCode'构造了所有传入参数的返回字符串(在这种情况下,由于第三个参数不是数字,因此传入的前两个参数)。 – 2010-11-02 14:21:41