Julia语言每次编译脚本,我们不能用julia编译二进制文件吗? 我尝试了一个带有println函数的小helloworld脚本,julia花了2,3秒来显示输出!如果我们可以制作二进制文件而不是每次编译都会更好
更新:自从我提出这个问题以来,朱莉娅已经有了一些变化。虽然我不再关注julia的更新,因为我已经问过这个问题,如果你正在寻找类似的东西,请查看以下答案和跟随julia的人的评论。
此外,很高兴知道现在加载脚本大约需要150毫秒。
答案 0 :(得分:96)
基诺的回答很明显,但也许我可以更详细地说明正在发生的事情以及我们计划采取的措施。
目前只有LLVM JIT模式:
即使在没有类型注释的情况下编写代码,Julia也能获得良好的性能:如果调用f(1)
,则会获得专门用于Int64
的代码 - 64位上1
的类型系统;如果你致电f(1.0)
,你会得到一个专门用于Float64
的新jitted版本 - 所有系统上1.0
的类型。由于函数的每个编译版本都知道它将获得什么类型,因此它可以以类似C的速度运行。您可以通过编写和使用“类型不稳定”函数来破坏它,其函数的返回类型取决于运行时数据,而不仅仅是类型,但我们在设计核心语言和标准库时非常注意不要这样做。 / p>
Julia的大部分都是自己编写的,然后进行解析,类型推断和jitted,因此从头开始引导整个系统大约需要15-20秒。为了加快速度,我们有一个分阶段系统,我们解析,类型推断,然后在文件sys.ji
中缓存类型推断AST的序列化版本。然后加载此文件并在运行julia
时用于运行系统。然而,sys.ji
中没有缓存LLVM代码或机器代码,因此每次julia
启动时仍需要完成所有LLVM jitting,因此大约需要2秒。
这个2秒的启动延迟非常烦人,我们有一个修复它的计划。基本计划是能够将整个Julia程序编译为二进制文件:可以运行的可执行文件或可以从其他程序调用的.so
/ .dylib
共享库,就好像它们只是共享C库一样。二进制文件的启动时间与任何其他C程序一样,因此2秒启动延迟将消失。
附录1:自2013年11月起,Julia的开发版本不再有2秒的启动延迟,因为它将标准库预编译为二进制代码。启动时间仍然比Python和Ruby慢10倍,所以还有改进的余地,但速度非常快。下一步是允许对软件包和脚本进行预编译,以便它们可以像Julia本身那样快速启动。
附录2:自2015年6月起,Julia的开发版本会自动预编译许多软件包,从而可以快速加载。下一步是整个Julia程序的静态编译。
答案 1 :(得分:40)
目前Julia JIT在启动时编译其整个标准库。我们知道这种情况,目前正在努力缓存LLVM JIT输出以纠正这种情况,但在此之前,没有办法解决它(除了使用REPL)。