在程序中的任何地方使用 eval 似乎会减慢其他代码,即使从未执行过。为什么是这样?
在下面的示例中有代码:
var data = Array.apply(null, Array(10000)).map(function(_, i) {
return i;
});
function notCalled() {
eval();
}
function simpleFor (d){
for (var i = 0, len = d.length; i < len; i += 1) {
d[i] = d[i] + 1;
}
}
如果eval()
两者都被注释掉simpleFor()
并且使用 for 循环具有相当的性能。eval()
本机循环何时会减速约 85%。我已经使用 jsperf 的 Chrome/Firefox 进行了测试,并使用了类似的脚本 nodejs。
示例位于:http: //jsperf.com/eval-wierdness
我最初的想法,以及我是如何发现这一点的,是创建一个函数来创建性能高效的映射函数,例如:
// naive first implementation
var emapcache = {};
function emap(fs, list) {
var f = emapcache[fs];
if (!f) {
f = emapcache[fs] = eval('(function (data) { for (var i = 0, s = data.length; i < s; i++) { data[i] = ' + fs.replace(/x/g, '(data[i])') + ';}})');
}
return f(list);
}
是否可以在不减慢其他代码速度的情况下使这样的功能高效?