2012-04-04 6 views
3

C#についても同様の質問がありますが、JavaScriptについては何も見つかりませんでした。JavaScriptループ外で変数を宣言すると、スピードとメモリのメリットはありますか?

ループ内で変数を宣言するのは慣例ですか?

ループを200回繰り返すと仮定します。

サンプル1よりもサンプル2を使用するためのパフォーマンスの要件(メモリとスピード)はありますか?私たちはjQueryを使ってループしています。ループ内にvarを保持するコードの可読性を向上させますが、それがベストプラクティスでない場合や、パフォーマンスが大幅に低下したり、メモリ使用量が高くなったりすると、スイッチされます。

**Sample 1:** 
$(this).each(function() { 
    var i = $(some_div).clone(); 
    *** edit i *** 
    $(another_div).append(i); 
}); 



**Sample 2:** 
var i = null; 
*** edit i *** 
$(this).each(function() { 
    i = $(some_div).clone(); 
    $(another_div).append(i); 
}); 
+0

なぜこれを測定しないのですか? –

+0

@ Crashalot:サンプル1では、各繰り返しで変数が作成されます。サンプル2では、変数が再利用されています。いくつかのパフォーマンステストを行ったことがありますか? –

+0

いいえ、これは確立されたパターンでなければならないため、ベストプラクティスを聞いてみたいと思っていました。 varが再利用されているためにパフォーマンスが向上すると仮定しますが、大きな利点があるかどうかは疑問です。 varsがループ内にある場合はコードを読む方が簡単ですが、速度とメモリのパフォーマンスが外部に宣言する必要がある場合は、それを行います。 – Crashalot

答えて

3

サンプル1(内部変数)が高速です: http://jsperf.com/variable-outside-faster

しかし、違いが気にするのに十分な価値はありません。

+0

うわー、これはクールです!どうやってこのサイトを見つけましたか? – Crashalot

+0

私たちは混乱しています。どのように内部が速いの?余分な操作(変数の宣言)を実行していませんか?我々はまた記憶への影響について興味がある。 – Crashalot

+0

@Crashalot私はPaulirish.comを使ってこれを見ました。私は彼からそれを得ました。私はなぜそれが速いのか説明できません、ただそれをテストしました。 – binarious

0

これは実装に依存しますが、原則としてパフォーマンスに顕著な違いはないと私は考えています。ループするためにjQueryを使用しているので、i変数は最初のケースでは関数スコープにあり、2番目のケースでは外側スコープにあります。これはメモリ割り当てに若干異なる影響を与えるかもしれませんが、目立つことはないでしょう。実装を選択し、実装のパフォーマンスを測定しようとする唯一の方法です。

0

これらは潜在的に意味的に異なるので、これはリンゴとオレンジの比較です。 同期の代わりにiをAjaxコールバック内で使用していた場合は、この変更を行った場合、異なる値のそれぞれではなく、iへの最後の割り当てをほぼ確実に使用します。

純粋な憶測は、次のとおりです。

は、結果的に我々はそれがより多くの仕事をしているしなければならない、あなたがフォーム内varの可能性をフルに使用していた場合は、各iに異なるメモリアドレスを必要とすることを知っています。

$.eachがコールバック引数を同期的に使用することを確認するには、かなりの分析が必要です。したがって、これは有効な最適化である場合、私はほとんどのJSコンパイラがそれを作ることができないと思うし、手作業であなたに(一定の時間)速度とメモリの改善を与える必要があります。

その他の考慮事項:

もっとレキシカルスコープが潜在的変数を見上げるの直線的に増加するコストを意味します。

3

これはマイクロ最適化です。これをやめてください。

代わりに読み取り可能なコードを記述し、コードのドキュメント化とテストを行うために力を入れてください。遅くあなたの大きさの順序を作るjQueryのように肥大化した抽象化を削除

  • はしかし、のために最適化する価値があるいくつかの高レベルの問題があります。
  • あなたはサーバ・クライアント旅行の待ち時間を短縮
  • あなたのアルゴリズムの大きなOの複雑さを軽減
  • 画面上をやっているレンダリングおよび描画の量を減らします。
+0

jqueryでない場合、モバイルサファリには何をお勧めしますか? – Crashalot

+1

モバイルはリソースが制約された環境です。パフォーマンスはいくつかのアプリで重要です。これが必要でないことを示唆するのに十分な情報がありません。 – AutoSponge

+0

@Crashalotライブラリーは必要ありません。 "vanilla javascript"を使用します。 – Raynos

関連する問題