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

时间:2014-03-19 14:37:46

标签: javascript google-chrome optimization google-chrome-devtools developer-tools

当我使用Chrome中的开发者工具收集JavaScript CPU配置文件时,我收到两个关于功能的神秘警告:

  • 未优化:优化次数
  • 未优化:内联保释

这些实际意味着什么?什么是可能的解决方案?

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

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

5 个答案:

答案 0 :(得分:21)

  1. 我认为“未优化:优化太多次”是指chrome优化器不断重新优化功能。

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

    如果我没记错的话,有几件事可能导致这种情况,包括改变类型的参数,我会尝试挖掘链接。

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

  2. '未优化:内联保释'似乎已在您发布的链接中回答。

  3. 对于try / catch,可以在此github页面上找到一个非详尽但有用的Chrome优化怪癖列表:

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

    此页面提到当前未优化尝试/捕获:

    • 发电机功能
    • 包含for-of语句的函数
    • 包含try-catch语句的函数
    • 包含try-finally语句的函数
    • 包含复合的函数允许赋值
    • 包含复合const赋值的函数
    • 包含包含 proto 的对象文字或获取或设置声明的函数。

答案 1 :(得分:7)

这些救助原因的解释正在众包并记录在这个github线程中:https://github.com/GoogleChrome/devtools-docs/issues/53

简短说明:V8不会尝试使用某些构造来优化函数,try / catch块就是一个例子,随着引擎的发展,完整列表可能会随着时间而变化。如果它试图优化它也会放弃它,然后必须多次去优化某些热函数(例如,因为每次函数执行时类型反馈都不同)。

答案 2 :(得分: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(...)等,这些函数在定义了所有参数的情况下被调用。

答案 3 :(得分:1)

第一个可能是因为引擎已对其进行了优化,但后来发现优化因某种原因没有用(可能返回类型随时间变化等)。

启用标志--trace-opt和--trace-deopt可以帮助您精确定位。

我的理由是,评论中提供的链接已经指明了你。

答案 4 :(得分:0)

我得到了很多'未优化:优化太多次'的警告,而且这些功能的运行速度比应有的慢得多。

通过执行以下操作,我能够修复这些功能:

  1. 删除未使用的变量声明

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