2012-04-22 70 views
45

Julia语言每次编译脚本,我们不能用julia编译二进制文件吗? 我尝试了一个带有println函数的小型helloworld脚本,它让茱莉亚花了2,3秒时间来显示输出!它会更好,如果我们可以做的二进制文件,而不是编译每次Julia每次编译脚本?

更新:目前已在朱莉娅一些改变,因为我问这个问题。虽然我不再关注julia的更新,但是因为我提出了这个问题,并且如果您正在寻找类似的东西,请查看以下茱莉亚跟随者的回答和评论。

此外,其良好的知道,现在大约需要150毫秒加载脚本。

回答

35

目前朱莉娅JIT编译在启动时它的整个标准库。我们知道这种情况,目前正在缓存LLVM JIT输出以纠正这种情况,但在此之前,除了使用REPL外,没有办法解决这个问题。

+17

这已在Julia nightlies中实施,并将包含在0.3版本中。启动时间大大提高。 – 2014-05-01 03:17:09

88

基诺的答案是当场就,但也许我可以给上发生了什么事,什么我们计划做一个关于它的更详细一点。

目前只有一个LLVM JIT模式:

  • 有一些简单的顶级语句非常琐碎的解释。
  • 所有其他代码在执行之前被分解为机器代码。该代码使用代码所运行的值的运行时类型进行专门的专门化,通过使用动态类型推断的程序进行传播。

这是朱莉娅如何得到,即使代码被写入没有类型标注性能好:如果你打电话f(1)你专门用于Int64码 - 的1对64位系统的类型;如果你打电话给f(1.0),你会得到一个专门用于Float64的新版本 - 所有系统上的1.0类型。由于该函数的每个编译版本都知道它将获得什么类型,因此它可以以类似C的速度运行。你可以通过编写和使用返回类型取决于运行时数据而不是类型的“类型不稳定”函数来破坏这一点,但我们在设计核心语言和标准库时非常小心,不要这样做。

大多数朱莉娅写入本身,然后解析,类型推断和即时编译,因此从头自举整个系统需要一些15-20秒。为了让它更快,我们有一个分阶段系统,在这个系统中,我们解析,类型推断,然后缓存文件sys.ji中的类型推断AST的序列化版本。当您运行julia时,该文件将被加载并用于运行系统。然而,没有LLVM代码或机器代码被缓存在sys.ji中,因此,每次启动julia时都需要完成所有的LLVM jitting,因此需要大约2秒。

这2秒的启动延迟是很烦人,我们有一个计划,以固定它。基本计划是能够将整个Julia程序编译为二进制文件:可运行的可执行文件或可从其他程序调用的共享库,就像它们只是共享C库一样。二进制启动时间与其他C程序相似,因此2秒启动延迟将消失。

附录1:自从2013年11月以来,开发版本的Julia不再有2秒的启动延迟,因为它将标准库预编译为二进制代码。启动时间仍然比Python和Ruby慢10倍,所以还有改进的余地,但速度非常快。下一步将是允许预编译软件包和脚本,以便能够像Julia本身那样快速启动。

附录2:从2015年6月开始,Julia的开发版本会自动预编译许多软件包,使它们能够快速加载。下一步是整个Julia程序的静态编译。

+6

我从去年左右就看到了大量关于Web的评论,指出编译的可执行文件/共享对象是Julia的目标,但没有任何进展迹象。 你能提供任何洞察事物的立场吗? – dfreeman 2013-03-06 21:26:32

+2

詹姆森纳什和以赛亚诺顿已经取得了很多进展,但还没有完成。 – StefanKarpinski 2013-09-25 17:29:32

+23

此功能现已完成并在Julia master上合并。现在,我的系统启动Julia的时间大约需要1.5秒,而现在需要大约150毫秒 - 这是令人印象深刻的10倍加速。如果我们可以设法累积10倍的加速,这完全有可能,Julia的启动时间将与Ruby和Python相当。 – StefanKarpinski 2013-12-16 15:55:08