14

我正在探索使用 Julia 作为通用科学计算语言(而不是 python),但它的启动时间非常缓慢。

有没有办法加快这个速度?

$ time python -c 'print "Hello"'
Hello

real    0m0.030s
user    0m0.018s
sys 0m0.010s

$ time julia -e 'println("Hello")'
Hello

real    0m4.614s
user    0m4.644s
sys 0m0.116s

附录是去年 Julia 的一位作者的一句话。这个策略有什么困难吗?

大部分 Julia 都是自己编写的,然后进行解析、类型推断和 jit 处理,因此从头开始引导整个系统需要大约 15-20 秒。为了让它更快,我们有一个分阶段的系统,我们在其中解析、类型推断,然后将类型推断的 AST 的序列化版本缓存在文件 sys.ji 中。当你运行 julia 时,这个文件会被加载并用于运行系统。但是,sys.ji 中没有缓存 LLVM 代码或机器代码,因此每次 julia 启动时仍然需要完成所有 LLVM jitting,因此大约需要 2 秒。

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

4

2 回答 2

8

不幸的是,Julia 目前使用大量时间来启动,因此几乎不可能在 bash 脚本中使用它来解决非常小的问题。通过一个复杂的示例,您可能会得到一个更偏向于 julia 的结果,该示例使用循环多次执行操作,但是在 2-4 秒的领先优势下,它需要一个大问题才能有足够的时间赶上。如果启动时间对您的科学计算来说是最重要的,那么 Julia 还没有准备好。

一个同样不公平的比较是使用愚蠢的递归公式来计算斐波那契数。如果超过 26,情况会变得更糟。还要注意 Julia 版本的代码是多么紧凑。

>>> ivarne~/dev/julia$ time julia -e 'fib(x) = x<2?1:fib(x-1)+fib(x-2);println(fib(36))'
24157817

real    0m2.763s
user    0m2.776s
sys     0m0.093s
>>> time python -c $'def fib(x):\n    if x<2: return 1\n    else: return fib(x-1)+ fib(x-2);\nprint fib(36)'
24157817

real    0m8.371s
user    0m8.336s
sys     0m0.025s

当您要求加快解决问题的方法时;这里是:

>>> time echo "Hello"
Hello

real    0m0.000s
user    0m0.000s
sys     0m0.000s
于 2013-09-26T14:31:10.603 回答
7

我在评论中提到的分支现在已被合并,并且 julia 比以往任何时候都更适合启动(并且什么都不做)。

$> time julia -e 'println("Hello")'
Hello

real    0m0.622s
user    0m1.013s
sys     0m0.624s

现在可在夜间构建中使用,并将包含在下一个 0.3 版本中。

于 2013-12-13T12:02:03.560 回答