4

我尝试使用 Chrome JS Profiler 记录 CPU 使用率来运行我的应用程序,但我收到了一些警告,有一些“ForInStatement 不是快速案例”,我已修复,但我得到了“Inlining Bailed Out”警告,例如在此代码中:

function display_loader(){
  for(i in obstacles){
    display(obstacles[i])
  }
}

该函数基本上创建了一个障碍物(display(obstacles[i]) 绘制了障碍物的特定图像 - 由于上面提到的“ForInStatement”警告,两个单独的函数用于加载和代码)。

消息“Inlining Bailed Out”随机出现,尤其是当我玩超过一分钟时,它出现在 move_loader、display_loader 或 collision_loader 函数中。有时会,有时不会。

你能给我任何文字解释'这条消息的真正含义吗?我在网上阅读了很多帖子,并且了解“ForInStatement”逻辑,但我对内联救助一无所知。

另外,你能告诉我如何解决它吗?

谢谢!

4

1 回答 1

1

通常,bailout表示无法优化功能。这可能来自不支持的 JS 功能,如try/catch块、for of等,或者因为优化过程遇到了某些限制。

正如文档总结的那样:

并非所有功能都可以优化。某些功能会阻止优化编译器在给定函数上运行(“纾困”)

系列文章给出了一些很好的解释。基本上,内联对于良好的性能至关重要。但是函数没有系统地内联,因为它有成本。通常,只有多次调用的函数才会被选中进行内联。

所以在你的情况下,我猜你的display函数中有一些东西会阻止优化。该消息不会直接弹出,因为并不总是/直接选择该函数进行优化:

这种优化方法的一个结果是,短时间运行的程序 [...] 不会退出它们的热身阶段,也不会得到优化。一般来说,没有必要浪费能源来优化只运行很短时间的东西。

此外,请注意 V8 使用非确定性采样分析器来检测热函数。因此,性能可能会根据分析滴答期间哪个功能处于活动状态而有很大差异

进一步阅读这里。希望这可以帮助。

于 2016-01-25T14:33:51.987 回答