缓慢的Julia启动时间

16

我正在探索将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秒钟的时间。为了使它更快,我们采取分阶段的系统,在解析、类型推导之后,将已推导的抽象语法树序列化并缓存到sys.ji文件中。当您运行julia时,会加载该文件并使用它来运行系统。然而,sys.ji文件中没有缓存任何LLVM代码或机器代码,因此所有LLVM JIT编译仍然需要每次启动Julia时执行,因此需要约2秒钟。

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


现在Julialang存储库中有一个分支可供查看。https://github.com/JuliaLang/julia/pull/4898。可能仍然存在一些问题,因此请自行决定是否尝试。它可能会包含在即将发布的0.3版本中。 - ivarne
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

1
我不确定比较的目的是什么。Python版本有缺陷 - 两个版本甚至没有计算出相同的数字!如果你关心紧凑性,你可以写成fib = lambda x: 1 if x < 3 else fib(x-1) + fib(x-2),尽管通常Python程序员更关心正确性和清晰度而不是字符数。 - DSM
我试图表明,当你比较Julia和Python的性能时,结果高度取决于你执行的任务。 - ivarne
2
我并不是在寻找最有效的回声 ;-P 我只是想知道在减少Julia开销方面的最新技术是什么。 - Matt W-D
嗨,我想指出(我是Python用户),如果你要使用Julia,你可能想在交互式环境中使用它,使用IPython的Python仍然可以调用Cython。你可以通过一个小型类型声明(def fib(int n): return 1 if n <= 2 else fib(n-1) + fib(n-2))即时将该函数Cython化,并实现(几乎?)C性能。 - marco

7

我在评论中提到的分支现已合并,julia对启动(和什么也不做)进行了更多优化。

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

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

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


Hello 实际用时 1分35.137秒 用户用时 0分0.328秒 系统用时 1分33.604秒我使用的是Julia 0.5.0版本,这是一台配备16GiB内存的Core i3机器,而不是树莓派! - Lord Loh.
似乎您的Julia安装出了一些问题。您使用的是哪个操作系统?以及您是如何安装Julia的? - ivarne
我正在使用Ubuntu 16.04.1 LTS。我是从“.tar.gz”文件安装的。 - Lord Loh.
这真的很奇怪,我无法想象是什么原因导致启动需要一分半钟的时间。(除非可能是安装在网络驱动器上,而且连接速度很慢。) - ivarne
谢谢您的回复。这是在我的家庭服务器上(已安装和运行 - 不是在网络存储上)持续运行的。上面的数字在几次运行中保持一致。但是,在重新启动后,我有了以下结果 - real 0m0.730s user 0m0.208s sys 0m0.332s - Lord Loh.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接