2

プログラムの任意の場所で 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;
  }
}

Ifeval()がコメントアウトされている場合と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);
}

他のコードを遅くすることなく、そのような関数を効率的にすることは可能ですか?

4

2 に答える 2

0

最新の JavaScript エンジンのほとんどは、コードを直接評価しません。代わりに、コードを何らかの中間形式にコンパイルし、最適化してから実行します。

ただし、 を使用するeval()場合、スクリプトがプリコンパイルされている場合、プログラムのコード全体は使用できません。つまり、多くの最適化は単純に不可能です。

于 2014-11-07T13:50:43.330 に答える