Chrome Profiler中的“未优化”警告是什么意思?
当我在Chrome中使用开发者工具收集JavaScript CPUconfiguration文件时,我得到了两个关于函数的神秘警告:
- 未优化:优化了太多次
- 未优化:内联保护
这些实际上是什么意思? 什么是可能的解决scheme?
我见过的另一个是未优化:TryCatchStatement ,但这是有道理的。 解决scheme是删除try-catch。
我迄今为止发现的最接近的解释是 – https://github.com/GoogleChrome/devtools-docs/issues/53
-
我相信“未优化:优化太多次”是指chrome优化器不断重新优化函数的时间。
https://groups.google.com/forum/#!topic/v8-users/_oZ4fUSitRY
如果我记得正确,有几件事情可以导致这个包括改变types的参数,我会尝试挖掘链接。
这个有点神秘,修复将取决于你的代码。 我已经有很多次在我的代码中popup,有时我无法修复它。
-
“未优化:内联保护”似乎在您发布的链接中回答。
-
对于try / catch,可以在这个github页面上find一个非穷举但有用的Chrome优化怪癖列表:
https://github.com/petkaantonov/bluebird/wiki/Optimization-killers
这个页面提到try / catches目前没有优化:
- 发电机function
- 包含for-of语句的函数
- 包含try-catch语句的函数
- 包含try-finally语句的函数
- 包含复合的函数让赋值
- 包含复合常数赋值的函数
- 包含包含proto或get或set声明的对象字面值的函数。
这些救援理由的解释是众包和github线程中logging: https : //github.com/GoogleChrome/devtools-docs/issues/53
简单的解释:V8不会尝试用一些构造来优化函数,try / catch块就是一个例子,随着引擎的发展,完整的列表可能随时间而改变。 它也可以放弃,如果它试图优化,然后不得不多次优化一些热门function(例如,因为每次执行function时types反馈不同)。
我曾有一个
function generate_year_blob(year,action,callback){ ... do_blob({act: action, cb:callback, ...}) ... }
我总是只使用一个参数generate_year_blob(this_year)
来调用它。
那些action
(预期是string)和callback
(预计是函数)被传递给do_blob()
函数。
当我将来自generate_year_blob(this_year)
的调用更改为generate_year_blob(this_year,'',null)
,“ 未优化:优化太多次 ”警告消失。
我没有立即发现这一点,因为有许多类似的函数generate_month_blob(...)
, generate_day_blob(...)
等被调用所有参数定义。
第一个可能是因为引擎已经优化了它,但是之后发现优化没有什么好处(也许返回types随着时间而变化等)。
启用标志–trace-opt和–trace-deopt应该可以帮助您查明。
我的借口,如果评论中提供的链接已经指出你在那里。
我得到了很多“未优化:优化太多次”的警告,而且这些function的运行速度比他们应该的要慢得多。
我能够通过做这些事情来解决这些function:
-
删除未使用的variables声明
-
从多次循环中删除函数调用(> 1000我怀疑)