4

大きな配列(10 ^ 5アイテム)を反復処理し、それぞれに対して操作を実行しています。

for (var row in rows) {
  switch (operator) {
    case "op1":
      row += 1;
      break;
    case "op2":
      ...
    case "opN":
      break;
  }
}

テストと可読性のために、その内部のswitchステートメントを独自の関数に抽出したいので、ループは次のようになります。

for (var row in rows) {
  this.updateRow(row, operator);
}

関数を10^5回呼び出すことに関連するオーバーヘッドは、顕著なパフォーマンスの低下を引き起こしますか?

4

2 に答える 2

2

インライン関数は、定義された関数よりも常に少し速くなります。これは、パラメーターや戻り値などが実行時にスタックからプッシュおよびポップされる必要がないためです。通常、これは新しいマシンではそれほど問題にはなりませんが、10 ^ 5の関数呼び出しを使用すると、パフォーマンスが少し低下する可能性があります。

私はおそらくそれをインラインに保つでしょう。それほど害はありません。少しでも最適化することで役立ちます。

于 2012-07-06T18:05:39.187 に答える
1

はい

JSPerf を使用して、ここで例をプロファイリングしました: http://jsperf.com/inline-switch-vs-switch-function

4 つの単純な算術演算子を使用してインライン switch ステートメントをテストし、100k アイテムの配列に対して独自の関数に抽出された同一の switch ステートメントをテストしました。また、ランダム化されたスイッチ演算子、最良のケースの演算子 (最初のスイッチ オプション)、および最悪のケースの演算子 (最後のスイッチ オプション) を使用してテストしました。

インライン switch ステートメントは全体的に機能を上回り、最悪の場合で約 150 ops/秒、最良の場合で約 600 ops/秒で機能を上回りました。

この状況では、インライン switch ステートメントの方が著しく高速です。

于 2012-07-06T18:55:36.603 に答える