当我阅读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开发人员。抱歉交叉发布。
答案 0 :(得分:6)
自己找到解决方案。
问题是String.fromCharCode()接受多个参数,Array.map()也将多个参数传递给回调。因此代码:
numbers.map(String.fromCharCode);
实际上相当于:
numbers.map(function(x, y, z){ return String.fromCharCode(x, y, z); });
从中可以明显看出它为何如此缓慢。另外它也有问题。