25

我是否编译 Racket 程序似乎对运行时性能没有影响。

最初只是通过编译改进了文件的加载吗?换句话说,运行racket src.rkt是否会即时进行 jit 编译,这就是为什么我认为编译与交互式没有区别?

即使对于整数算术的紧密循环,我认为会出现一些差异,无论我之前是否执行过raco make.

我错过了一些简单的东西吗?

PS,我注意到我可以对源文件(.rkt)或.zo文件运行球拍。球拍会自动使用.zoif one is found 对应的.rkt文件,还是.zo需要显式使用文件?无论哪种方式,这对我看到的性能数字都没有影响。

4

2 回答 2

29

你是对的。

Racket 分两个阶段编译代码:首先,将代码编译成字节码形式,然后在运行时将其 jit 为机器码。当你编译一个文件时,你基本上是在创建字节码,以便以后重新编译它。由于这通常不会花费大量时间来处理小段代码,因此您不会在运行时看到任何明显的差异。举个极端的例子,你可以删除*.zo集合树中的所有文件并启动 DrRacket——这需要很多由于有大量代码,因此需要开始时间,但是一旦开始,它将几乎像往常一样运行。(单击“运行”也会很慢,因为这会重新加载并重新编译一些文件。)对于较大的代码段的另一个问题是编译过程可能会使内存消耗更高,但这对于较小的代码段也不是问题.

有关如何提高性能的提示,另请参阅指南中的“性能”一章。

于 2012-04-13T05:03:28.153 回答
14

Racket 将始终编译您的代码,无论它是在 REPL 上以交互方式运行还是从命令行运行。是指南中解释它的部分。在交互模式下,编译器将每个表达式/定义转换为内存中的字节码并执行。否则,编译器将字节码输出到 zo 文件。

注意:Eli 和我同时回复了。有关更多详细信息,请参阅他的回复。

于 2012-04-13T05:03:28.933 回答