Javascript eval()正在减慢其他代码的速度,为什么?

Javascript eval()正在减慢其他代码的速度,为什么?,javascript,eval,jsperf,Javascript,Eval,Jsperf,在程序中的任意位置使用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

在程序中的任意位置使用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;
  }
}

是否可以在不降低其他代码速度的情况下使这样一个函数高效运行?

您可以通过
新函数('param','body')

var-emapcache={};
函数emap(fs,list){
var f=emapcache[fs];
如果(!f){
f=emapcache[fs]=新函数('data','for(var i=0,s=data.length;i
一般来说,
eval
破坏了许多编译器优化。特别是在这个代码片段中,它会减慢其他代码的速度,因为它可以将全局范围和局部范围都包含在计算代码中。它破坏了JIT编译器可以做的一些优化,因为为了
eval
,必须跟踪循环中的变量。但是在
simpleFor
中,引擎不需要关心变量(因此可以很容易地缓存函数)

很难说
Function
构造在安全性方面优于
eval
,但是
Function
没有考虑局部范围,所以它可能更快

我这里有一个参考微基准来说明这两者之间的性能差异。

大多数现代javascript引擎不会直接计算代码。相反,他们将代码编译成某种中间形式,对其进行优化,然后执行它


但是,如果使用
eval()
,则在预编译脚本时,程序的整个代码都不可用。这意味着许多优化根本不可能。

我同意
eval
至少是不好的。但这个答案的措辞似乎放大了如今
eval
的违法行为。您是刚刚做了这个测试,还是用实际代码测试了
eval
方法并比较了性能?像当前JS引擎中的优化器一样,优化器无法对这种特殊类型的代码进行正确或任何优化,这并不少见,因为它们是为处理真实世界的代码而设计的。谢谢,我从来没有想过使用
新函数
// 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);
}
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);
}