6

オプション1:割り当てなしの複数の変数

function MyFunction() {

  var a = null;
  var b = null;
  ....
  var z = null;

  a = SomeValue;
  b = SomeValue2;
  ....
}

オプション2:1つのvarステートメント、割り当てなし

function MyFunction() {

  var a, b ..., z;

  a = SomeValue;
  b = SomeValue2;
  ....
}

オプション3:割り当てのある複数のvarステートメント

function MyFunction() {

  var a = SomeValue;
  var b = SomeValue2;
  ....
  var z = SomeValue26;
}

特定のオプションを使用することによるパフォーマンス上の利点はありますか?AND両方のプリミティブ型の割り当て、オブジェクト参照の割り当てに当てはまりますか?

ご入力いただきありがとうございます。

4

7 に答える 7

17

「時期尚早の最適化はすべての悪の根源です」

このオプションを使用しても、パフォーマンスに大きな変化はないと思います。
(IMO)3番目のオプションは、最も読みやすいオプションであり、C#etc'のような動的メモリ割り当てに最も近いものです。しかし、これは私の謙虚な意見です、あなたが最も好きなものを選んでください。

それが本当にあなたを悩ませ、あなたが答えなしで眠ることができないならば、jsPerfでそれをテストしてください。


@ChadはjsPerfを作ったので、今夜はぐっすり眠れます...

于 2012-03-12T18:26:38.487 に答える
6

パフォーマンスを理解するには、最初に巻き上げを理解する必要があります。次のコードを見てみましょう。

var x = 1;

function bar(val) {
    var returnVal = val * 2;

    return returnVal;
}

function foo(val) {
    var returnVal = 10;

    returnVal *= bar(val);

    return returnVal;
}

var y = foo(x);

console.log(y); // 20

ホイストとは、基本的に、JavaScriptインタープリターが変数宣言をスコープの先頭に「ホイスト」することを意味します。この例を次のように見せます。

var x, y;

x = 1;

function bar(val) {
    var returnVal;

    returnVal = val * 2;

    return returnVal;
}

function foo(val) {
    var returnVal;

    returnVal = 10;
    returnVal *= bar(val);

    return returnVal;
}

y = foo(x);

console.log(y); // 20

したがって、与えられた例では、オプション2と3は基本的に同じことを行います。インタプリタはそれらの宣言を一番上に移動するので。その時点で、それは好みの決定です。多くの人は、var x, y, z;危険だと言うようなことをするのを避けます。私は個人的にそれをします。私がどのスコープにいても、すべての変数を一番上で宣言し、次にそれらを下で使用します。しかし、どちらの方法でも機能します。

さて、あなたの最初の例は最も効率が悪いです。吊り上げると、次のようになります。

function MyFunction() {
    var a, b, ... z;

    a = null;
    b = null;
    ...
    z = null;

    a = someValue;
    b = someValue2;
    ...
    z = someValueN;
}

基本的に、変数を2回設定することになります。

于 2012-03-12T18:45:57.467 に答える
1

Chromeでは、実行時間は同じです

ここでの唯一の実際の考慮事項は、ネットワーク転送の最適化です。

var a=1;var b=2;...;var z=9;対を検討するvar a=1,b=2,...,z=9;

各識別子の前にを置くと、;var 5バイト(1バイトの文字エンコードを想定)であるのに対し、は1バイトになり,ます。var したがって、26個の変数を宣言すると、 1回書き込み、識別子をコンマでリストすることにより、100バイトを節約できます。

確かにそれは大きな節約ではありませんが、ネットワーク上でビットをプッシュすることになると、すべてのバイトが役立ちます。それほど心配する必要はありませんが、同じ領域で複数の変数を宣言していることに気付いた場合は、変数宣言リストを使用すると、JSファイルから数バイトを簡単に削減できます。

于 2012-03-12T18:47:04.650 に答える
0

それは時期尚早の最適化、すべての悪の根源のようです。

何回実行されますか?これはプログラム全体の何分の1を消費しますか?

于 2012-03-12T18:27:03.980 に答える
0

パフォーマンスに関するあなたの質問に、いくつかの質問で対抗します。

  1. パフォーマンスの問題に気づきましたか?
  2. varステートメントがボトルネックであると判断しましたか?
  3. 各バージョンをテストしましたか?

これらすべての答えはノーだったと思います。

確実に知る唯一の方法はそれらを実行してテストすることですが、どのオプションも大きな違いを生むべきではありません。JavaScriptが非同期のクライアント側言語であるということは、ステートメントをあらゆる種類のボトルネックにするために、非常に大量のコードを実行する必要があることを意味します。var


var最後に、使用するバージョンを決定する場合は、割り当てなしで1つのステートメントを使用することをお勧めします。

function () {
    var a,
        b,
        c,
        foo,
        bar,
        fizz,
        buzz;
    a = 1;
    ...
    b = 3;
}

この理由は、これが基本的に変数の巻き上げのためにコードが実行される方法であるためです。for次に、初期化ステートメントを移動して、ループ内など、変数が最初に使用される場所に移動できます。

function foo(arr) {
    var i,
        l;
    ...
    for (i = 0, l = arr.length; i < l; i++) {
        doStuff(arr[i]);
    }
    ...
}
于 2012-03-12T18:29:00.820 に答える
0

それらはすべて基本的に同じことをします:変数を宣言し、最終的にそれを定義します(それに何かを割り当てます)。例全体で変更しているのは、それが発生する順序だけです。それでも、JavaScriptをコンパイルしているブラウザーによって異なります。一部のユーザーは、他のユーザーが実行しない最適化を実行する場合があります。

ただし、従う必要のあるスタイル上のガイドラインがいくつかあり、この回答はそれらをよく説明しています。その答えはテクノロジーにとらわれず、JavaScriptにはまったく当てはまらない可能性があることに注意してください。

于 2012-03-12T18:30:26.940 に答える
0

可能であればオプション1から離れてください。2つの割り当てを行う必要はありません。

forループまたは他の複合ステートメント/ブロック内で宣言された変数でさえ、それを含むブロックの外で使用できます。

次のこともできます。

function MyFunction() {

  var a = SomeValue, b = SomeVavlue2;

}
于 2012-03-12T18:43:53.043 に答える