【问题标题】:What do the "Not optimized" warnings in the Chrome Profiler mean?Chrome Profiler 中的“未优化”警告是什么意思?
【发布时间】:2014-04-25 21:34:04
【问题描述】:

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

  • 未优化:优化太多次
  • 未优化:内联退出

这些实际上是什么意思?有哪些可能的解决方案?

我见过的另一个是未优化:TryCatchStatement,但这是有道理的。解决办法是去掉try-catch。

到目前为止,我发现的最接近的解释尝试是这个 - https://github.com/GoogleChrome/devtools-docs/issues/53

【问题讨论】:

  • html5rocks.com/en/tutorials/speed/v8 查看“优化编译器”部分
  • 感谢@epascarello,这是一篇很棒的文章。我仍然不确定为什么我的代码会导致这些错误,但这应该可以为我提供更多信息以进行更多故障排除。
  • 你的代码中有 try/catch 吗?
  • 您能否将代码的相关部分添加到此问题中,以便其他人可以参考代码示例给出解释?
  • 如果您可以添加示例或代码链接,也许我可以提供帮助?

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


【解决方案1】:
  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

    此页面提到当前未优化 try/catch:

    • 生成器函数
    • 包含 for-of 语句的函数
    • 包含 try-catch 语句的函数
    • 包含 try-finally 语句的函数
    • 包含复合 let 赋值的函数
    • 包含复合 const 赋值的函数
    • 包含包含 proto 或 get 或 set 声明的对象字面量的函数。

【讨论】:

    【解决方案2】:

    我收到很多“未优化:优化太多次”的警告,这些函数的运行速度比应有的慢得多。

    我可以通过做这些事情来修复这些功能:

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

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

    【讨论】:

      【解决方案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(...) 等在调用时都定义了所有参数。

      【讨论】:

        【解决方案4】:

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

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

        【讨论】:

        • 谢谢保罗。在阅读该问题中的一些 cmets 时,似乎“内联纾困”可能被简化为“不要向现有对象添加新属性”。但是“优化太多次”似乎还没有答案。
        【解决方案5】:

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

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

        如果 cmets 中提供的链接已经将您指向那里,我的借口。

        【讨论】:

          猜你喜欢
          • 2014-08-25
          • 2014-01-09
          • 1970-01-01
          • 2013-08-18
          • 2020-04-03
          • 1970-01-01
          • 1970-01-01
          • 2013-12-01
          • 2014-04-17
          相关资源
          最近更新 更多