当我阅读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开发人员看到。对于交叉发布表示抱歉。
String.fromCharCode
从传入的所有参数构造返回的字符串(在这种情况下,仅使用前两个传入的参数,因为第三个不是数字),所以期望的结果是不同的。 - Andy E