谷歌分析器中的“未优化”警告是什么意思?

61

当我使用Chrome开发者工具来收集JavaScript CPU Profile时,我在函数上得到了两个神秘的警告:

  • 未优化:已优化次数过多
  • 未优化:内联失败

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

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

至今为止我找到的最接近解释的尝试是这个- https://github.com/GoogleChrome/devtools-docs/issues/53


8
请看"The Optimizing Compiler"一节。 - epascarello
谢谢@epascarello,这是一篇很棒的文章。我仍然不确定为什么我的代码会导致那些错误,但这应该能给我更多信息来进行故障排除。 - Luke
你的代码中有try/catch吗? - epascarello
你能否在这个问题中添加你代码的相关部分,以便其他人可以参考代码示例给出解释? - surfmuggle
如果您能提供一个示例或代码链接,我或许可以帮助您? - Brendan
5个回答

21
  1. 我认为"Not optimized: optimized too many times"是指Chrome优化器一直在重新优化一个函数。

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

    如果我没记错,有几个因素会导致这种情况发生,包括参数类型的变化,我会尝试找到链接。

    这个问题有点神秘,修复方法取决于你的代码。我在我的代码中遇到过这个问题很多次,有时候我就是无法解决它。

  2. "Not optimized: inlining bailed out"似乎在你发布的链接中得到了回答。

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

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

    该页面提到,以下函数目前没有被优化:

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

7
这些救助原因的解释正在这个github帖子中进行众包和记录:https://github.com/GoogleChrome/devtools-docs/issues/53 简单的解释是:V8不会尝试对具有某些结构的函数进行优化,try/catch块就是一个例子。随着引擎的发展,完整列表可能会发生变化。如果它尝试进行优化,然后不得不多次取消优化一些热点功能(例如,因为每次函数执行时类型反馈都不同),则也可能放弃优化。

感谢保罗。在阅读该问题中的一些评论时,似乎“内联操作失败”可能被简化为“不要向现有对象添加新属性”。但现在好像还没有“优化过多次”的答案。 - Luke

3

我有一个函数 generate_year_blob(year,action,callback)

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

do_blob() 函数中传递了这些参数 action(应该为字符串)和 callback(应该为函数)。

当我把调用从 generate_year_blob(this_year) 改成 generate_year_blob(this_year,'',null) 后,'Not optimized: optimized too many times' 警告消失了。

我没有立即发现这一点,因为还有许多相似的函数 generate_month_blob(...)generate_day_blob(...) 等等,所有这些函数都被定义了所有参数。


1

第一个原因可能是引擎进行了优化,但后来发现这种优化有些问题(可能是返回类型随时间变化等)。

启用--trace-opt和--trace-deopt标志应该有助于您找出问题所在。

如果评论中提供的链接已经指向了那里,则请原谅我。


0

我收到了很多“未优化:优化次数过多”的警告,并且这些函数的运行速度比应该的要慢得多。

通过以下方法,我成功修复了这些函数:

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

  2. 从迭代次数较多(>1000)的循环中移除函数调用


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接