2013-12-17 48 views
4

這裏是我的javascript代碼,這是很簡單的:什麼是Chrome的這種差距意味着devtools輪廓火焰圖表

console.profile(); 
var count = 1000; 
var fn1 = function() { 
    for (var i = 0; i < count; i++) { 
     console.log("THIS IS FN1"); 
    } 
} 

var fn2 = function() { 
    for (var i = 0; i < count; i++) { 
     console.log("THIS IS FN2"); 
    } 
    fn1(); 
} 

fn2(); 
console.profileEnd(); 

,這是我的個人資料截圖:

enter image description here

爲什麼會出現在圖像中有一些差距,就像我的黑色矩形標記的一樣?

這個差距是什麼意思?

+3

你應該看到的是'fn2'頂部的1000個小'log'調用。然而,由於'log'調用幾乎沒有時間,並且由於對配置文件數據進行採樣,所以最終會有一些調用被合併爲一個塊,而其他調用將被忽略。您可以通過在DevTools設置中打開**「高分辨率CPU分析」**來增加採樣間隔。然後你應該得到這樣的東西:http://i.imgur.com/E67WWqX.png。然而,它仍然沒有解釋爲什麼'f2'被分成幾塊,即使只被調用一次。 –

回答

9

你看日誌調用之間的差距對的FN2和FN1頂級這種非均勻序列,因爲分析器是採樣,讓您只統計信息。它會停止JS線程並每1ms大約捕捉一次當前調用堆棧(高分辨率模式下爲100us),每個條的寬度與我們看到相同調用堆棧的連續樣本數成正比。

fn2的分裂是一個錯誤。由於我們停止JS線程處於隨機狀態,因此並不總是可以迭代JS調用堆棧,頂部框架可能是一半構造的。我們盡最大努力確定虛擬機的當前狀態並抓取調用堆棧,但有時我們的啓發式方法會失敗,在這種情況下,我們最終可能會捕獲不完整的堆棧,就像您的情況一樣。

+0

嗨!很好的解釋,你知道這是否是一個報告的錯誤?你有一個crbug鏈接嗎? –