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 中的“未优化”警告是啥意思?的主要内容,如果未能解决你的问题,请参考以下文章
我可以对 Chrome 中的“overflow:scroll”div 中的“repaints on scroll”警告做些啥吗