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

Posted

技术标签:

【中文标题】Chrome Profiler 中的“未优化”警告是啥意思?【英文标题】: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 吗? 您能否将代码的相关部分添加到此问题中,以便其他人可以参考代码示例给出解释? 如果您可以添加示例或代码链接,也许我可以提供帮助? 【参考方案1】:

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

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

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

    这个有点神秘,修复将取决于您的代码。我的代码中多次出现此问题,有时我无法修复它。

    “未优化:内联已退出”您发布的链接中似乎已回答。

    对于 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】:

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

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

    删除未使用的变量声明

    从多次迭代的循环中删除函数调用(>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 中提供的链接已经将您指向那里,我的借口。

【讨论】:

以上是关于Chrome Profiler 中的“未优化”警告是啥意思?的主要内容,如果未能解决你的问题,请参考以下文章

NSight Profiler 信号 139

为客户解决 Chrome 中的“不常用下载”警告[关闭]

离子 4 未优化 APK

Chrome 中的百分比行轨道和排水沟警告

我可以对 Chrome 中的“overflow:scroll”div 中的“repaints on scroll”警告做些啥吗

为啥我的 Chrome Profiler 没有为我的对象显示正确的保留路径,为啥我的对象从未被释放?