【问题标题】:What optimizations do modern JavaScript engines perform?现代 JavaScript 引擎执行哪些优化?
【发布时间】:2011-01-04 14:05:11
【问题描述】:

到目前为止,大多数主流浏览器已开始将优化 JIT 编译器集成到其 JavaScript 解释器/虚拟机中。这对每个人都有好处。现在,我很难确切知道它们执行了哪些优化以及如何最好地利用它们。每个主要 JavaScript 引擎的优化参考有哪些?

背景:

我正在开发一个编译器,它可以从更高级和更安全的语言生成 JavaScript(无耻的插件:它被称为 OPA,它非常酷),鉴于我正在生成的应用程序的大小,我会就像我的 JavaScript 代码一样快并且尽可能节省内存。我可以处理高级优化,但我需要更多地了解执行了哪些运行时转换,以便了解哪些低级代码会产生最佳结果。

我想到的一个例子:我正在编译的语言将很快集成对惰性的支持。 JIT 引擎在惰性函数定义方面表现良好吗?

【问题讨论】:

  • 就我个人而言,我认为利用编译器/jit 优化的最佳方法是尽可能自然、可读和可维护地生成代码,并让编译器/jit 发挥它的魔力。任何专门针对编译器优化的尝试都可能导致代码的可维护性降低,并且在一两年内,当编译器全部更改时,您的优化将不再有效。
  • 好吧,可读/可维护的代码并不是我真正的目标。我是从一种与 JS 完全不同的语言编译的,所以我不希望任何人对生成的 JS 做太多的阅读。至于 JIT 的魔力和优化的无效性,嗯,是的,你说得有道理。

标签: javascript ajax performance jit


【解决方案1】:

This article series 讨论 V8 的优化。总结:

在这种情况下,前两点可能对您没有多大帮助。第三个可能显示出将事物缓存在一起的洞察力。最后一个可能会帮助您创建具有相同属性的对象,以便它们使用相同的隐藏类。

This blog post 讨论 SquirrelFish Extreme 的一些优化:

  • 字节码优化
  • 多态内联缓存(如 V8)
  • 上下文线程 JIT(引入原生机器代码生成,如 V8)
  • 正则表达式 JIT

TraceMonkey is optimised via tracing。我不太了解它,但它看起来像是在某些“热代码”中检测到变量的类型(代码经常在循环中运行)并根据该类型创建优化的代码变量是。如果变量的类型发生变化,它必须重新编译代码——基于此,我想说你应该远离在循环中改变变量的类型。

【讨论】:

  • 精确垃圾回收? ... :S
  • 很有趣,谢谢。我需要看看类转换。现在,转到其他浏览器:)
  • V8 资料阅读。 TM 读。顺丰读。旁注:所描述的 SF 技术看起来,嗯,有点令人失望。特别是,如前所述,他们的上下文线程看起来比我所知道的大多数 JIT 技术要笨得多。
【解决方案2】:

我发现了一个额外的资源:

【讨论】:

    猜你喜欢
    • 2011-09-29
    • 2019-07-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多