3

Javascript パフォーマンス ガイドの多くは、次の 2 つの点を強調する傾向があります。

  • 範囲内にとどまります。各スコープで変数を段階的に検索すると、コストがかかります。
  • 不必要な変数を絶えず作成して、ガベージ コレクターを悪用しないでください。

60fps などの高速で実行されるプログラムの場合、パフォーマンスに違いはありますか? JSPerfは私のシステムでは 2 つの間を行き来しているように見えるので、このタイプのものを最適化する方法についてもう少し知りたいです。次の 2 つのコード サンプルを検討してください。

var t0;

function doSomethingGlobal() {
    t0 = getWhatever();
    t0.func1();
    t0.func2();
}

function doSomethingLocal() {
    var t0 = getWhatever();
    t0.func1();
    t0.func2();
}

http://jsperf.com/global-verses-local

4

2 に答える 2

2

グローバルにアクセスする頻度と、グローバルが実行コンテキストでどれだけ深くネストされているかに依存すると思います。たとえば、10 レベル以上の実行コンテキストから変数にアクセスするよりも、「より高い」実行コンテキストから変数にアクセスする方が高速です (JS エンジンによっては、結果とエンジンの最適化が異なると思います)。

テストを少し変更して、グローバル変数に 50 回アクセスできるようにしました。この特定のテストでは、ローカル アクセスが最大 5 倍速くなりました(Firefox 19.0 と Chrome 26 での簡単なテストの場合)。

すべてのパフォーマンス関連の問題と同様に、経験則ではこれまでのところしか解決できません。コードをベンチマークしコードにとって意味のある最適化を行う必要があります

于 2013-04-05T09:05:47.480 に答える
1

2番目のステートメントは完全に正しいわけではないことに注意してください。あなたは言う:

不必要な変数を絶えず作成して、ガベージ コレクターを悪用しないでください。

あなたがしたい:

不要なオブジェクトを常に割り当てて、ガベージ コレクターを悪用しないでください。

ローカル変数はスタックに割り当てられるため、問題は変数を格納する場所ではありません (ローカルとグローバルを区別するときに話していることです)。これは安価で簡単です。これらの場所に格納されているオブジェクトを追跡しているため、参照をどこに格納しても実質的に同じコストがかかります。

ご存知のように、グローバル変数はルックアップに時間がかかることが多いため、避けるべき理由の 1 つです。また、それらは扱いにくく、保守がより困難なコードにつながります。これが、それらを避ける最大の理由だと思います。ガベージ コレクターの観点からは、どちらか一方を選択する理由はありません。

最後に、変数アクセスがページの速度を大幅に低下させていると信じる特別な理由がない限り、なぜそれらのパフォーマンスを心配する必要があるのでしょうか? 最初に保守可能なコードを書きましょう!

于 2013-04-05T10:30:18.037 に答える