当我使用Chrome开发者工具来收集JavaScript CPU Profile时,我在函数上得到了两个神秘的警告:
- 未优化:已优化次数过多
- 未优化:内联失败
这些警告实际上是什么意思?有哪些可能的解决方案?
另一个我见过的是未优化:TryCatchStatement,但这很合理。解决方案是删除try-catch语句。
至今为止我找到的最接近解释的尝试是这个- https://github.com/GoogleChrome/devtools-docs/issues/53
当我使用Chrome开发者工具来收集JavaScript CPU Profile时,我在函数上得到了两个神秘的警告:
这些警告实际上是什么意思?有哪些可能的解决方案?
另一个我见过的是未优化:TryCatchStatement,但这很合理。解决方案是删除try-catch语句。
至今为止我找到的最接近解释的尝试是这个- https://github.com/GoogleChrome/devtools-docs/issues/53
我认为"Not optimized: optimized too many times"是指Chrome优化器一直在重新优化一个函数。
https://groups.google.com/forum/#!topic/v8-users/_oZ4fUSitRY
如果我没记错,有几个因素会导致这种情况发生,包括参数类型的变化,我会尝试找到链接。
这个问题有点神秘,修复方法取决于你的代码。我在我的代码中遇到过这个问题很多次,有时候我就是无法解决它。
"Not optimized: inlining bailed out"似乎在你发布的链接中得到了回答。
关于try/catch,可以在这个github页面上找到一个非全面但有用的Chrome优化怪癖列表:
https://github.com/petkaantonov/bluebird/wiki/Optimization-killers
该页面提到,以下函数目前没有被优化:
我有一个函数 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(...)
等等,所有这些函数都被定义了所有参数。
第一个原因可能是引擎进行了优化,但后来发现这种优化有些问题(可能是返回类型随时间变化等)。
启用--trace-opt和--trace-deopt标志应该有助于您找出问题所在。
如果评论中提供的链接已经指向了那里,则请原谅我。
我收到了很多“未优化:优化次数过多”的警告,并且这些函数的运行速度比应该的要慢得多。
通过以下方法,我成功修复了这些函数:
删除未使用的变量声明
从迭代次数较多(>1000)的循环中移除函数调用