我是否编译一个Racket程序似乎对运行时性能没有任何影响。
最初是通过编译改进了文件的加载吗?换句话说,运行racket src.rkt
是否会动态执行jit编译,这就是为什么我认为编译与交互没有区别?
即使对于整数运算的紧密循环,我认为会出现一些差异,无论我之前是否raco make
,配置文件时间都相等。
我错过了一些简单的东西吗?
PS,我注意到我可以针对源文件(.rkt
)或.zo
文件运行racket。如果找到与.zo
文件相对应的.rkt
,或者.zo
文件是否需要明确使用,是否会自动使用{{1}}?无论哪种方式,它对我所看到的性能数字没有任何影响。
答案 0 :(得分:23)
是的,你是对的。
Racket分两个阶段编译代码:首先,代码被编译成字节码形式,然后当它运行时,它会被嵌入到机器代码中。编译文件时,基本上就是创建字节码,以便以后重新编译它。由于这通常不会花费大量时间来处理小块代码,因此您不会在运行时看到任何明显的差异。举一个极端的例子,您可以删除集合树中的所有*.zo
文件并启动DrRacket - 由于有大量代码,因此需要批次时间才能启动,但一旦它确实开始了,它会像往常一样运行。 (单击“运行”也会很慢,因为这将重新加载并重新编译一些文件。)更大的代码片段的另一个问题是编译过程会使内存消耗更高,但这也不是小代码片段的问题
另请参阅指南中的Performace chapter,了解有关如何提高效果的提示。
答案 1 :(得分:12)
无论是在REPL上以交互方式运行还是从命令行运行,Racket都将始终编译您的代码。 Here是指南中解释它的部分。在交互模式下,编译器将每个表达式/定义转换为内存中的字节码并执行该操作。否则,编译器将字节码输出到zo文件。
注意:Eli在我做的同时回复。有关详细信息,请参阅他的回复。