将性能挤出 v8

Squeezing performance out of v8

提问人:nornagon 提问时间:1/17/2011 更新时间:7/2/2011 访问量:3106

问:

有没有关于如何为 v8(特别是 node.js)编写快速、高效的代码的好教程?

我应该避免使用哪些结构?v8 优化好的成语有哪些?

JavaScript 性能 节点 .js

评论

0赞 mVChr 1/17/2011
只是好奇,但你为什么要问?难道你不应该更关心从最慢(但广泛使用)的渲染引擎中榨取性能,而不是最快的渲染引擎吗?似乎最快的会照顾好自己。
0赞 nornagon 1/17/2011
我只是想知道 v8 不喜欢什么。高效的代码对我来说很重要。
0赞 Chris GW Green 4/4/2014
很好的回复 nornagon - 当问题被忽视并且回答无关时,这令人难以置信地令人沮丧。我也只是为了兴趣而感兴趣!

答:

0赞 mVChr 1/17/2011 #1

文档给出了一个很好的答案:http://code.google.com/apis/v8/design.html

评论

0赞 nornagon 1/17/2011
文档还不够。例如:V8 是否做内联?函数调用的成本有多高?创建对象的成本有多高?我想知道 v8 在各种情况下有多聪明,而不仅仅是财产访问。
18赞 Ivo Wetzel 1/17/2011 #2

根据我的经验:

  • 它做内联
  • 函数调用开销最小(内联)
  • 昂贵的是将巨大的字符串传递给函数,因为这些字符串需要被复制,而且根据我的经验,V8 并不总是像在这种情况下那样聪明
  • 范围查找成本高昂(出乎意料)
  • 不要耍花招,例如,我有一个用于 JS 对象的二进制编码器,通过位移(而不是 Math.floor)来产生一些额外的性能 最新的曲轴(是的 alpha,但仍然)运行代码的速度慢 30%
  • 不要使用魔法。eval、arguments.callee 等。这些几乎扼杀了任何优化,因为代码不能再内联
  • 一些新的 ES5 内容,例如 目前在 V8 中真的很.bind()
  • 不知何故,目前速度更快一些(MICROoptimization,除非你正在编写一些疯狂的编码器,否则坚持使用 和new Object()new Array(){}[])

我的规则:

  • 写出好的代码
  • 编写工作代码
  • 编写在严格模式下工作的代码(支持仍然必须落地,但当它落地时,V8 可以应用进一步的优化)

如果你是一个 JS 专家,并且你已经将所有好的实践应用到你的代码中,那么你几乎无法做任何事情来提高性能。

如果遇到性能问题:

  • 验证它们
  • 更改代码/算法
  • 作为最后的手段:编写一个 C++ 扩展(并观察 GitHub 上对 ry/node 的每次提交,因为没有人关心某些内部更改是否会破坏您的构建)

评论

0赞 nornagon 1/18/2011
谢谢 -- Javascript Garden 看起来很棒 :)
0赞 Pijusn 7/24/2013
这是一篇旧文章,但我最近看到了一些关于确切事物的精彩视频(来自 Google IO 2012)。它于 2012 年出版,所以情况发生了一些变化,但我想不大:youtu.be/UJPdhx5zTaw
0赞 Jason Davies 7/2/2011 #3

了解 V8 是 nodecamp.eu 的一组幻灯片,提供了一些非常有趣的提示。特别是,我发现关于避免“字典模式”的注释很有用,即如果您保持对象的“形状”不变并且不向它们添加任意属性,它会有所帮助。

您还应该运行 node with(仅在 64 位平台(例如 OS X)上需要)来查看 V8 是否在 JIT 上“拯救”某些功能。还有大量其他跟踪选项,包括各种其他 GC 跟踪,这些选项对于优化很有用。--crankshaft --trace-opt --trace-bailout--crankshaft--trace-gc

如果您对上面的幻灯片有任何具体问题,请告诉我,因为它们有点简洁。:-)它们不是我的,但我对它们所涵盖的领域做了一些研究。