好奇即时编译器(JIT Compilers)如何工作的吗?最近来自 Mono JIT 团队的两篇帖子通过描述他们在这些领域的工作情况揭示了 Trampolines(弹簧床机制)和代码共享的工作原理。
Mono 是一个主要遵循 ECMA 标准的.NET 平台的开源版本。它被定位于给传统的开源和.NET 开发人员使用,通过最近几年的不懈努力,它已经成为一个可用的平台了。现在,你在可以在 Mono 平台上体验好几个 Gnome 应用程序,以及 MP3 播放器—— Sansa Connect 。
Paolo Molaro 谈到了 Trampolines(弹簧床机制)和它们是如何影响 JIT 运行时内存使用的。简而言之,一个“弹簧床”就是一个函数存根,它能在被调用的时候,触发 JIT 执行。一旦 JIT 编译这个函数成为机器码,那么“弹簧床”的指针就会被替换为真实函数的指针。
通过寻找一种被虚方法使用的共享“弹簧床” 的途径,Paolo 将会减少 Mono 所需“弹簧床”数量的大约三分之一。这样的节约,能让应用程序之间有着很大的不同。
在上面的情形中,对于 MonoDevelop 来说生成的“弹簧床”的数量从 21000 个减少到 7700 个(节约了 160KB 的内存),对于 IronPython 来说从 17000 个减少到 5400 个,以及对于一个“Hello World”的程序从 800 个减少到 150 个。
与此同时, Mark Probst 也谈到了跨泛型和它们创建出的进程来共享代码的问题。
现在,让我们看看我走过了多少路途来实现泛型共享的。开始的时候,我们只能共享非泛型非静态的方法。接着,我们只能共享所有类型的参数都是引用类型的泛型的实例。后来,Dictionary 类和字典能共享方法了。当然,最后所有的功能都被实现了。
评论