0

この質問のために簡略化したこのコードスニペットがあります。

//var a is generated once at runtime
//from an array of strings
//and an array of functions
var a = [ 
            "Start ",
            function(){return "middle ";}, //returns dynamic data
            "end"
        ],
    c = "";

//this for-loop represents a call
for(var i = 0; i < a.length; i++){
    var d = typeof a[i] === 'function' ? a[i]() : a[i];
    c = c.concat(d);
}
console.log(c);

さて、最初の質問:私の呼び出し(forループ)は言うよりも最適ではありませんか...

var call = a[0]+a[1]()+a[2];

...実行時に呼び出しが作成された場所はどこですか?

条件付きの質問:後者の呼び出しがより最適なアプローチである場合、この最適な呼び出し変数/オブジェクト/関数を生成するにはどうすればよいですか?

最後の条件付き質問:最後の質問で私が何を求めているのか理解できない場合は、無視してください。代わりに、私のコードをさらに最適化できるかどうか、そしてどのようにしたらよいか教えてください。

編集:私は先に進み、24Mの呼び出しを実行することでコードのベンチマークを行いました。呼び出し変数は、私の見積もりから約10%高速です。

4

2 に答える 2

0

ここでの主な答えは次のとおりです。forループは、これまでに気付くようなパフォーマンスの低下をもたらすことはありません。

しかし:

が実行時に生成される場合a、それを生成する何かが必要です。もしそうなら、配列ではなく、関数を直接生成してみませんか?

var acall = function() {
  return "Start, " + dynamic() + "end";
};

また

var acall = function() {
  return "Start, " + (function() {
    return "middle ";
  })() + "end";
};

本当に重要なのは、実行時に がどのよう aに生成されるかです。eval通常、またはそのいとこに頼ることなく、実行時に関数を生成できますnew Function...

于 2012-05-25T21:41:08.597 に答える
0

このコードは正しく、パフォーマンスの面では問題ありませんが、私には適切ではありません。私がすることは次のとおりです。

var a = [ 
  "Start ",
  function(){return "middle ";}, //returns dynamic data
   "end"
];

var c = a.map(function(item) {
  return typeof item === 'function' ? item() : item;
}).join('');

console.log(c);

forこれは、各反復で文字列に追加するよりも優れているようです。

于 2012-05-25T21:43:29.967 に答える