gpt4 book ai didi

javascript - eval() 正在减慢其他代码,为什么?

转载 作者:行者123 更新时间:2023-11-29 19:32:21 27 4
gpt4 key购买 nike

在程序的任何地方使用 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() 存在时, native 循环会减速约 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);
}

是否可以在不减慢其他代码速度的情况下使这样的函数变得高效?

最佳答案

您可以通过 new Function('param', 'body')

var emapcache = {};
function emap(fs, list) {
var f = emapcache[fs];
if (!f) {
f = emapcache[fs] = new Function('data', 'for (var i = 0, s = data.length; i < s; i++) { data[i] = ' + fs.replace(/x/g, '(data[i])') + ';}');
}
return f(list);
}

一般来说,eval 破坏了许多编译器优化。特别是在这个代码片段中,它会减慢其他代码的速度,因为它可以将全局和局部范围都纳入评估代码。它打破了 JIT 编译器可以做的一些优化,因为为了 eval,必须跟踪循环中的变量。但是在 simpleFor 引擎中不需要关心变量(所以函数可以很容易地缓存)。

很难说 Function 构造在安全意义上优于 eval,但是 Function 没有考虑局部作用域,所以它可能会更快。

我这里有一个引用微基准来说明这两者之间的性能差异。 http://jsperf.com/eval-vs-func-so-question

关于javascript - eval() 正在减慢其他代码,为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26802196/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com