簡體   English   中英

javascript var語句和性能

[英]javascript var statement and performance

選項1:沒有賦值的多個var

function MyFunction() {

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

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

選項2:一個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對象引用賦值都是如此嗎?

感謝您的輸入。

“過早優化是萬惡之源”

我不認為任何這些選項都會有任何重大的性能變化。
(IMO)第三個選項是最易讀的選項,最接近動態內存分配,如C# etc'。 但這是我的拙見, 選擇你最喜歡的。

如果它真的困擾你,你沒有答案就無法入睡,請用jsPerf測試它。


@Chad制作了一個jsPerf讓你今晚睡得好...

要了解性能,首先應了解吊裝 我們來看下面的代碼:

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;這樣的事情var x, y, z; 說這很危險。 我個人而言,這樣做。 在我所處的任何范圍內,我將在頂部聲明所有變量,然后在下面使用它們。 但無論哪種方式都有效

現在,您的第一個例子效率最低。 吊裝后它看起來像這樣:

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

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

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

它基本上導致設置變量兩次。

在Chrome中, 執行時間相同

這里唯一真正的考慮因素是優化網絡傳輸

考慮var a=1;var b=2;...;var z=9; var a=1,b=2,...,z=9;

如果你在每個標識符前放置一個;var ,那就是5個字節(假設是單字節字符編碼),而a ,則為1個字節。 因此,聲明26個變量,您可以通過編寫var一次並使用逗號列出標識符來節省100個字節。

雖然這不是一個巨大的節省,但每個字節都有助於推動網絡上的比特。 這不是什么值得擔心的問題,但是如果你發現自己在同一區域中聲明了幾個變量,那么使用變量聲明列表可以輕松地從JS文件中刪除幾個字節。

這似乎是過早的優化,是萬惡之源。

它會執行多少次? 整個程序的哪一部分會消耗掉?

我會用幾個問題反駁你關於表現的問題:

  1. 您是否注意到性能問題?
  2. 你確定你的var語句是瓶頸嗎?
  3. 你測試過每個版本嗎?

我將假設所有這些的答案都是否定的

沒有任何選項可以產生任何顯着差異,盡管唯一可以確定的方法是運行它們並進行測試。 JavaScript作為一個異步客戶端語言意味着,你必須運行的代碼認真大量var語句是任何形式的瓶頸。


最后,如果您決定使用哪個版本,我建議使用單個var語句而不分配:

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

其原因在於,這主要是由於可變提升而導致代碼執行的方式。 然后我可以移動initialize語句,以便首次使用變量,例如在for循環中:

function foo(arr) {
    var i,
        l;
    ...
    for (i = 0, l = arr.length; i < l; i++) {
        doStuff(arr[i]);
    }
    ...
}

它們基本上都做同樣的事情:聲明一個變量並最終定義它(為它分配一些東西)。 在整個示例中,您唯一要改變的是發生的順序,甚至這取決於編譯JavaScript的瀏覽器 - 有些可能會執行其他人沒有的優化。

你應該遵循一些風格指導, 這個答案很好地解釋了它們。 請記住,該答案與技術無關,可能根本不適用於JavaScript。

如果可能的話,只要遠離選項1,就不需要進行兩項任務。

即使在for循環或其他復合語句/塊中聲明的變量也可以在其包含塊之外使用。

你也可以這樣做:

function MyFunction() {

  var a = SomeValue, b = SomeVavlue2;

}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM