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

时间:2010-11-02 13:57:11

标签: javascript optimization

当我阅读Guido van Rossum的文章An Optimization Anecdote时,它开始了。

决定在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 个答案:

答案 0 :(得分:6)

自己找到解决方案。

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

numbers.map(String.fromCharCode);

实际上相当于:

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

从中可以明显看出它为何如此缓慢。另外它也有问题。