61

當我使用Chrome的開發者工具來收集JavaScript的CPU配置文件,我得到的功能的兩個神祕的警告:Chrome Profiler中的「未優化」警告是什麼意思?

  • 沒有得到優化:優化過很多次
  • 沒有得到優化:內聯跳傘

這些實際上意味着什麼?什麼是可能的解決方案?

我見過的另一個是未優化:TryCatchStatement,但這是有道理的。解決方案是刪除try-catch。

在解釋最近的嘗試,我發現到目前爲止是這樣的 - https://github.com/GoogleChrome/devtools-docs/issues/53

+8

http://www.html5rocks.com/en/tutorials/speed/v8/請看「優化編譯器」部分 – epascarello

+0

謝謝@epascarello,這是一篇很棒的文章。我仍然不確定爲什麼我的代碼會導致這些錯誤,但是應該給我更多的信息來解決它。 – Luke

+0

你的代碼中有try/catch嗎? – epascarello

回答

1

第一種可能是因爲引擎優化它,但後來發現沒有優化好由於某種原因(也許回報類型隨時間而變化等)。

啓用標誌--trace-opt和--trace-deopt應該可以幫助您查明。

我的藉口,如果評論中提供的鏈接已經指出你在那裏。

21
  1. 我認爲「未優化:優化太多次」是指chrome優化器不斷重新優化函數的時間。

    https://groups.google.com/forum/#!topic/v8-users/_oZ4fUSitRY

    如果我沒有記錯,有幾件事情,可能會導致這包括改變類型參數,我會盡力挖出的鏈接。

    這一個有點神祕,修復將取決於您的代碼。我已經在我的代碼中彈出了很多次,有時我無法修復它。

  2. '未優化:內聯保護'似乎在您發佈的鏈接中回答。

  3. 對於try/catch語句,鉻優化怪癖的非詳盡且有用的名單可以在這個GitHub的網頁上找到:

    https://github.com/petkaantonov/bluebird/wiki/Optimization-killers

    這頁提到,嘗試/捕獲當前未優化:

    • 發生函數包含一個語句-的
    • 功能
    • 包含一個try-catch語句包含含有的化合物的try-finally語句
    • 的功能讓含有一種化合物常量分配包含
    • 功能的指定
    • 功能
    • 功能功能包含proto的對象文字,或獲取或設置聲明。
7

這些救市的原因的解釋是被衆包並記錄在此github上線:https://github.com/GoogleChrome/devtools-docs/issues/53

的簡短說明:V8不會去嘗試一些結構優化功能,try/catch塊是舉一個例子,隨着發動機的發展,完整列表可能會隨時間而改變。它也可以放棄它是否嘗試優化,然後必須多次去優化一些熱門函數(例如,因爲每次函數執行時類型反饋都不相同)。

+0

謝謝保羅。在閱讀該問題中的一些評論時,似乎「內聯保護」可能被簡化爲「不要將新屬性添加到現有對象」。但似乎還沒有「優化太多次」的答案。 – Luke

3

我有一個

function generate_year_blob(year,action,callback){ ... do_blob({act: action, cb:callback, ...}) ... }

和我把它叫做始終只使用一個像這樣的generate_year_blob(this_year)參數。

那些action(預期是字符串)和callback(預計是函數)被傳遞給do_blob()函數。

當我換了電話從generate_year_blob(this_year)generate_year_blob(this_year,'',null),在「未優化:優化過很多次」警告消失。

我沒有立即發現這一點,因爲有許多類似的功能generate_month_blob(...)generate_day_blob(...)等,這些功能都是在定義了所有參數的情況下調用的。

0

我得到了很多'未優化:優化太多次'的警告,而且這些函數的運行速度比他們應該的慢得多。

我能夠做這些事情,來修復這些功能:

  1. 刪除未使用的變量聲明

  2. 刪除功能從重複多次循環(> 1000我懷疑)

  3. 調用
相關問題