2013-07-24 47 views
0

我只是好奇。也許有人知道2013年JavaScript引擎可以優化什麼,他們不能做什麼?任何關於最近的未來的假設?我一直在尋找一些好文章,但互聯網上仍然沒有「聖經」。JavaScript優化:如何更有效地緩存局部變量的初始值?

好吧,讓我們專注於單一quesiton:

假設我有一個被稱爲每10ms或在緊密循環功能:

function bottleneck() { 

    var str = 'Some string', 
     arr = [1,2,3,4], 
     job = function() { 
      // do something; 
     }; 

    // Do something; 
    // console.log(Date.getTime()); 
} 

我不必計算變量的初始值每一次,如你所見。但是,如果我將它們移動到較高範圍,我將放棄變量查找。那麼有沒有辦法告訴Javasript引擎做這樣一個明顯的事情 - 預先計算變量的初始值?

我照顧了jsperf to clear my question。我正在嘗試不同的類型。我對函數和原語特別感興趣。

回答

1

如果你需要每10ms調用一次函數,這是一個瓶頸,首先應該考慮的是「我不應該每10ms調用一次這個函數」。你做的架構出了問題。也就是說,見http://jsperf.com/variables-caching/2中的1b,它比「緩存」版本快四倍 - 主要原因是對於代碼中的每個變量,您要麼移動範圍,要麼重新聲明。在1b中,我們上一次範圍,得到「首字母縮寫」,然後從本地參考中爲其內容設置本地別名。節省了很多時間。需要被創建的每個時間

1

(關注V8)

井陣列數據本身不被創建,但一個獨特陣列對象。值爲1,2,3,4的支持數組由這些對象共享。

該字符串爲interned,它實際上是最快速地將相同的字符串作爲文字複製粘貼,而不是引用某個通用變量。但是爲了維護,你並不是真的想這樣做。

不要創建一個熱點函數中的任何新功能,如果您job函數從bottleneck功能,那麼首先引用了所有這些變量的任何變量都將成爲上下文分配,並在任何地方訪問,即使在外部函數慢,它會截至目前阻止inlining of the bottleneck function。內聯是一項重大優化,您可以在其他情況下不想錯過。