扶 凯 2014年04月25日 - 10:49
2

译文….不太会的地方就直接英文了…大家将就一下
在这个 blog 写更新有一段时间了.  一个非常高兴的事情是 
timotimo  在写每周 Perl 6 的进度weekly Perl 6 reporter,, 所以这是个非常好的东西, 还会定期更新. 不过我想花点时间来分享我的观点,我所见到的从全局出发的大的更新.

Optimization, optimization, optimization!

近来主要的努力方向就是持续优化. 我们使用 NQP 来实现 Rakudo 中在 Perl 6 编译器上的功能子集.  MoarVM 的性能开始接近 Perl 5 了并且 JVM 中的 Perl 6 有些长时间运行的东西超过了 Perl 5. 相比之下Rakudo 本身的表现本身比较糟糕值得庆幸的是事情已经变得好转因为我们已经努力改善优化,减少常用功能的成本并逐渐开始缩小差距这主要涉及两个 Rakudo 和 NQP 优化阶段的工作, 主要改善内置函数和一些其它面象性能的变化.仍然有大量的工作要做 Rakudo上内置支持 MoarVM 大家认为可能会在下一版本中。有关 MoarVM 在 Rakudo 中提升的东西, 4 月份主要是:

数组和散列访问速度更快3倍以上
大多的 multi-dispatches 开销小很多

很多很多非必需标量分配都优化掉
Rakudo 中的  forest fire benchmark 每秒渲染帧多两倍多
编译器的性能更好约为15

相比起 Rakudo 上的 Parrot 差别更加明显. 对于单独使用编译器的性能, 差别巨大: 你可以在 80s 内 build 完整个 MoarVM 中的 Rakudo . 这个时间小于 Parrot 完成  CORE.setting (the built-ins) 编译中的 parse/AST 解析就花掉的时间. 对于这些时间会影响用户尝试 Perl 6 . 

One consequence of this work is that Rakudo on MoarVM is often sneaking ahead of Rakudo on JVM on some benchmarks now, even once the mighty JVM JIT kicks in. This won’t last long, though; a couple of the optimizations done will not be a great deal of work to port to the JVM, and then it can re-claim its crown. For now! :-)

Introducing “spesh”

其实性能的相关的工作是 MoarVM 本身另一个层次的东西, 这个项目第一个目标是 "只运行 NQP 和 Perl 6", 这个 VM 只需要简单的解释提交过来的字节码. 这并不意味这没有认真的对以后的方向进行设计 – 只是在执行方面的重点是简单, 正确, 完备的做为 Rakudo 的后. 基于这个目标的实现, 这个项目正常在进行的下一个阶段是: 实现基于运行时的可用程序信息进行动态优化, 如果依赖于的东西被中断, 使用推测的优化来撤销 等等.

这个方面的第一步会包含在这个月的 MoarVM 中发布中, 与要感谢很多编译器本身的性能改进(因为编译器也是 VM 上运行的程序). 想看概述最好的方法是看看 MoarVM 的  src/spesh.

  • graph 这是用于生成字节码表现形式(在帧的水平)来适于分析和转化(涉及优化两个步骤). 它一开始通过创建一个控制流图. 然后通过这个来计算生成树, 用它来重命名变量, 从而产生字节码的静态单赋值形式从而给定名称只写入一次从而简化分析的很多很多方面。
  • args takes a tuple of incoming arguments, considers their types, arity, and so forth. It produces a set of guard clauses that indicate when a given specialization of the code applies (that is, a version of the code improved by making assumptions about what was passed), and then re-writes various argument access instructions to “unsafe” but fast ones that it can prove will always work out.
  • facts takes the graph, looks through it for sources of type information (including the incoming arguments) and does an initial propagation of that information through the graph. It creates usage counts to be later used in dead code elimination.
  • optimize 是通过 annotated graph 并通过这个我们应用了一些优化了,虽然并不是很多. 到目前为止, 我们有了一个能安全转换的框架. 并会在接下来加入更多优化,目前我们就可以开始的事情是:

    • 在方法调用上避免哈希查找
    • 设置单态方法的缓存
    • 在类型检查方面,可能能消除代码的整个分支
    • 重写属性绑定 
    • 减少 dead code
  • codegen 目前是采用 graph 优化, 并再产生字节码。然而,在未来的(如果我们幸运的话,那么我希望 GSoC 项目会直接产生机器代码代替.
  • deopt 相关的处理: 对一些固定的特定代码, 解除其它的依赖, 这些代码会调用堆栈, 对于这种特定的代码, 找到它们并调整返回的地址和数据结构, 这样非常安全(虽然当然更慢), 对于非这些特定的代码, 需要根据需求来检查.

 

总的来讲, 这些实质上是 MoarVM 的 JIT 要做的. 当然, 这并不是生产机器码. 但 JIT 的编译返回的是高效的字节码, 虽然我们倾向于认为即时编译器主要是“程序转换成机器代码. 当然这些是真正任何现代的 JIT 上只是很小部分, 另一部分是机器代码产生前的程序分析和专业化也同样重要. 所以我们主要专注于这一块, 并且成效很好.

并发

Perl 6的并发性方面继续取得进展。JVM 上实现的并发特性, 从 3 月到现在有各种各样的性能提升, MoarVM 在 Perl 6 中现在也支持大部分的并发特性. 目前这些还支持得比较早, 还没到生产环境的级别. 这些包含的功能会在 4 月发布, 如果你做什么重要的并发的事情, 还是使用 Rakudo 上的 JVM .如果你只是要一些基础的功能, 就可以使用这个.

Rakudo 上的 MoarVM 取得了 spectest 的王冠

Rakudo 在各种后端的支持下有着最高的 specification 测试通过率. 今下, Rakudo 上的 MoarVM 工作的取得领先的地位. 为什么 ? 因为他有最好的 Unicode database 内省的支持还通过了一系统的测试, 目前还没有其它的后端虚拟机做到. 些外, 它这些 Unicode 相关的东西比 Parrot 好, 但 JVM 没有. 最后, 它最重要的是他现在可以通过一系列的并发测试. 

多个后端虚拟机支持的 Rakudo Star

我本希望 Rakudo 会在 3 月支持三个后端(注: 译文的时候, 已经支持). 在 3 月时, 没有加入, 4 月才加入, 主要是该模块的测试出现了一些漏洞. MoarVM 后端虚拟机的加入, 让大多数程序都有显着的性能提行较低的启动时间, 和更加少的内存使用.

Where next?

在未来的几个月我将把重点放在以下几个方面:

  • 更多的 Rakudo 和 NQP 的优化, 生成更加快速和小的 code.
  • 更多的改善 Rakudo 的内置插件, 让他们更加有效的运作.
  • 要让 MoarVM 并发支持更强劲, 提高并行 GC .
  • 推进 I/O, 并让这个很好的支持运行在 JVM 和 MoarVM 的平台上.
  • spesh 的教学需要更好, 有一堆的数据存储可以做得更小的开销, 以及能够更好地优化 multiple  调度
  • 改善原生类型的支持包括提供原生 arrays.

除了近来我会参加 FOSDEM 的大会外, 我近来一直藏起来写代码到现在,  但我们的的道路上越来越快! 接下来我会在荷兰波兰和捷克参与 Perl Workshops. 并期待看到大家分享我们的工作. 也希望能在这见到大家.

 



2 Comments

  1. anon说道:

    好多年没关注perl6项目了,现在进度加快了?
    MoarVM啥时候出来的,这是要代替parrot节奏?

    • 扶 凯说道:

      嗯, MoarVM 出来半年多,可以通过所有的 Perl 6 的测试,并发线程都完整支持了.现在主要工作都是在做性能优化了.

Add New Comment