Chrome Profiler中的“未优化”警告是什么意思?

当我在Chrome中使用开发者工具收集JavaScript CPUconfiguration文件时,我得到了两个关于函数的神秘警告:

  • 未优化:优化了太多次
  • 未优化:内联保护

这些实际上是什么意思? 什么是可能的解决scheme?

我见过的另一个是未优化:TryCatchStatement ,但这是有道理的。 解决scheme是删除try-catch。

我迄今为止发现的最接近的解释是 – https://github.com/GoogleChrome/devtools-docs/issues/53

  1. 我相信“未优化:优化太多次”是指chrome优化器不断重新优化函数的时间。

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

    如果我记得正确,有几件事情可以导致这个包括改变types的参数,我会尝试挖掘链接。

    这个有点神秘,修复将取决于你的代码。 我已经有很多次在我的代码中popup,有时我无法修复它。

  2. “未优化:内联保护”似乎在您发布的链接中回答。

  3. 对于try / catch,可以在这个github页面上find一个非穷举但有用的Chrome优化怪癖列表:

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

    这个页面提到try / catches目前没有优化:

    • 发电机function
    • 包含for-of语句的函数
    • 包含try-catch语句的函数
    • 包含try-finally语句的函数
    • 包含复合的函数让赋值
    • 包含复合常数赋值的函数
    • 包含包含proto或get或set声明的对象字面值的函数。

这些救援理由的解释是众包和github线程中logging: https : //github.com/GoogleChrome/devtools-docs/issues/53

简单的解释:V8不会尝试用一些构造来优化函数,try / catch块就是一个例子,随着引擎的发展,完整的列表可能随时间而改变。 它也可以放弃,如果它试图优化,然后不得不多次优化一些热门function(例如,因为每次执行function时types反馈不同)。

我曾有一个

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

我总是只使用一个参数generate_year_blob(this_year)来调用它。

那些action (预期是string)和callback (预计是函数)被传递给do_blob()函数。

当我将来自generate_year_blob(this_year)的调用更改为generate_year_blob(this_year,'',null) ,“ 未优化:优化太多次 ”警告消失。

我没有立即发现这一点,因为有许多类似的函数generate_month_blob(...)generate_day_blob(...)等被调用所有参数定义。

第一个可能是因为引擎已经优化了它,但是之后发现优化没有什么好处(也许返回types随着时间而变化等)。

启用标志–trace-opt和–trace-deopt应该可以帮助您查明。

我的借口,如果评论中提供的链接已经指出你在那里。

我得到了很多“未优化:优化太多次”的警告,而且这些function的运行速度比他们应该的要慢得多。

我能够通过做这些事情来解决这些function:

  1. 删除未使用的variables声明

  2. 从多次循环中删除函数调用(> 1000我怀疑)