プログラムの任意の場所で 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);
}
他のコードを遅くすることなく、そのような関数を効率的にすることは可能ですか?