2015-02-05 59 views
1

我想知道什麼是更好的方式在JavaScript我的NodeJS項目代碼,所以我這樣做:的Javascript PERF,奇怪的結果

function clas(){ 
 
} 
 

 
clas.prototype.index = function(){ 
 
\t var i = 0; 
 
\t while(i < 1000){ 
 
\t \t i++; 
 
\t } 
 
} 
 

 
var t1 = new clas(); 
 
var f = 0; 
 
var d1 = new Date(); 
 
while(f < 1000){ 
 
\t t1.index(); 
 
\t f++; 
 
} 
 
console.log("t1: "+(new Date()-d1)+"ms"); 
 

 

 
f=0; 
 
var d2 = new Date(); 
 
while(f < 1000){ 
 
\t var t2 = new clas(); 
 
\t t2.index(); 
 
\t f++; 
 
} 
 
console.log("t2: "+(new Date()-d2)+"ms");
在我的瀏覽器

,第一第二個是相同的... 1ms和nodejs,我有t1 = 15ms和t2 = 1ms,爲什麼?爲什麼第一次比第二次需要更多的時間,因爲他沒有初始化我的課程?

+0

只是隨機的評論,你知道這個網站嗎? http://jsperf.com/這個網站測試瀏覽器的JavaScript,但認爲在大多數情況下,獲勝的性能也適用於Node.js. – 2015-02-05 18:20:03

+0

任何好的JITter都會優化大部分'index'的主體,因爲它顯然不會對'i'做任何事情。在循環內調用'index'應該觸發內聯。如果虛擬機足夠聰明,它會意識到內聯函數是死代碼,幾乎可以忽略整個事情。你需要在'index'中調用一些外部函數來防止這種情況。 – ssube 2015-02-05 18:21:24

+0

'while(i <1000){i ++;}'就像'i = 1000;'帶有一些編譯器優化 – Hacketo 2015-02-05 18:38:04

回答

1

這裏有幾個問題。您的示例顯示您在基準測試或系統性能方面的經驗很少。這就是爲什麼我建議brushing up on the very basics,直到你有更多的感覺,不要嘗試優化。 Optimizing prematurely is generally a bad thing。如果某人對性能優化一無所知,那麼「優化」最終會成爲純粹的噪聲:有些工作,有些則不是,幾乎是隨機的。

爲了完整起見,這裏有一些事情是不對您的測試用例:

首先,1000是不夠的性能測試。您想要爲CPU執行數百萬次的迭代,以便在其上花費大量時間。

其次,對於基準測試,您想要use a high performance timer。節點爲什麼給你15ms的原因是因爲它使用粗粒度系統定時器,其最小單位約爲15ms,這很可能對應於你的系統的scheduling granularity

第三,關於您的實際問題:如果沒有必要,在您的循環內部分配一個新對象幾乎總是不當的選擇。有很多事情正在進行,包括堆分配的可能性。然而,在你的簡單的情況下,大部分的運行時間可能會優化掉大部分的開銷,原因有二:

  1. 你的測試用例是太簡單了,並且優化器可以輕鬆地優化簡單的代碼段,但有一個在實際情況下更艱難的時間。
  2. 您的測試用例是transient。如果優化器足夠聰明,它會檢測到,並且會跳過整個循環。
+0

好吧! :D我會嘗試更多的迭代和「高性能計時器」謝謝! – Banou26 2015-02-05 18:21:56

+0

在節點的情況下,高分辨率定時器將是['process.hrtime()'](http://nodejs.org/docs/latest/api/process.html#process_process_hrtime)。 – mscdex 2015-02-05 18:22:34

+0

爲了在循環內部分配新的對象,這是因爲我想知道在我的nodejs項目中是否爲每個請求創建一個新的控制器對於perf是壞的想法,或者如果我需要初始化控制器並讓此控制器爲每個請求執行工作 – Banou26 2015-02-05 18:45:33

0

這是因爲節點對代碼進行了時間延遲(JIT)編譯優化。通過JIT優化,我們的意思是節點在執行時試圖優化代碼。

因此......第一次調用函數需要更多時間,並且節點意識到它可以優化這個for-loop,因爲它什麼也不做。而對於所有其他調用,執行優化循環。

所以......後續的電話會花費更少的時間。

您可以通過更改順序來嘗試。第一次電話會花更多的時間。

因爲在某些瀏覽器中代碼是提前優化的(即在運行代碼之前)。