【发布时间】:2014-01-04 00:21:15
【问题描述】:
我改编了一个简单的程序来计算和绘制 Julia 的运动涡流来测试语言,我也是用 Python 编写的,没有什么特别的原因。
(免责声明:1. 我读到的关于 stackoverflow 的每一次性能比较都因不全面/不正确/写得好/相关等而受到抨击 - 我不是假装这是一个真正的比较,我只是想知道如何让 Julia 更快。2. 我知道 python 可以被优化,在 Cython 等中实现,这不是这个讨论的一部分,它只是在这里作为 Julia 和 Python 中等效函数的参考。)
代码和性能结果可见in a gist。
Julia 的性能明显慢于 Fortran。执行计算本身所花费的时间是(50000 个时间步):
Fortran: 0.051s
Julia: 2.256s
Python: 30.846s
Julia 比 Fortran 慢得多(约慢 44 倍),差距缩小,但在 10 倍以上的时间步长 (0.50s vs 15.24s) 时仍然显着。
这些结果与the julia home page 上显示的结果明显不同。我究竟做错了什么?我可以将 Julia 修复得更快吗?
我已经浏览了 Julia Performance Tips 页面和 Julia 主页上比较背后的代码,但没有什么值得我解决的。
另外有趣的是,Julia 加载 PyPlot (5secs ish!!) 的速度非常慢,而且读取文本文件的速度也比 Python 慢得多。我可以做些什么来改善这些事情吗?
请注意,上述时间并未显示 Julia 和 Python 的加载时间,它只是计算 AFAIK 所需的原始时间 - 请参阅代码。对于fortran,这就是全部。在每种情况下,绘图已大致关闭,以便进行速度比较。
计算机:Intel i7-3770,16GB 内存,SSD HD,操作系统:Ubuntu 13.10 64bit.,Fortran:gfortran,GNU Fortran (Ubuntu/Linaro 4.8.1-10ubuntu9) 4.8.1,Julia:版本 0.3.0- prerelease+396 (2013-12-12 00:18 UTC), Commit c5364db* (0 days old master), x86_64-linux-gnu, Python: 2.7.5+
更新:
根据 ivarne 的建议,我重写了 Julia 脚本(在上面的要点中更新):将 grunt 工作封装在函数中,声明所有内容的类型并将矩阵的不同元素拆分为不同的数组(如果适用)。 (我在很多地方都包含了 Float64,因为我尝试使用 Float32 看看是否有帮助,但大部分时间都没有)。
结果如下:
50,000时间步长:
Fortran: 0.051s (entire programme)
Julia: raw calc.: 0.201s, calc. and return (?): 0.758s, total exec.: 6.947s
500,000时间步长:
Fortran: 0.495s (entire programme)
Julia: raw calc.: 1.547s, calc. and return (?): 2.094s, total exec.: 8.521s
总结:
你可以加快 Julia 的速度。
您可以显着影响 Julia 的速度,具体取决于您衡量其性能的方式。
【问题讨论】:
-
他们确实在基准测试中提到了使用 BLAS。 matmul 的性能在 Fortran、C、Julia 和 MATLAB 中几乎相同,这也让其脱颖而出。如果测试的很大一部分花费在某个预编译库中,那么语言之间的比较可能不是公平的。也许您应该尽可能尝试用 BLAS 调用替换部分代码并再次进行比较?
-
在 Julia 中不需要在函数上声明类型,除非你想使用它进行多次调度。列表推导通常也无需任何努力即可获得正确的类型。如果您有类型/不可变结构,则必须声明类型以获得良好的性能。
-
A +1 仅用于免责声明。
标签: performance fortran fortran77 julia