为什么Julia代码性能比Fortran低很多?
我在几个地方读到 Julia 代码的性能可以(在某些条件下)与 Fortran 相比较。我在 Julia 中编写了以下代码:
Pi = 3.141592653589793238462643
n = 100000
function integration_2d(n,Pi,sum)
h = Pi/n
for i=1:n
x = h*(i-0.5)
for j=1:n
y = h*(j-0.5)
sum = sum + cos(x + y)
end
end
sum*h*h
end
平均执行时间为 180 秒。与使用-O3选项编译的 Fortran 代码相比,结构非常接近的 Fortran 代码的执行时间为 0.013 秒。我想知道 Julia 代码在哪里失去了性能,任何评论都值得赞赏。谢谢。
回答
由于您没有提供 Fortran 代码,我假设您的代码与 Fortran 的实现方式不同。您的 O(N^2) 算法需要 CPU 每秒执行 > ~10^12 次操作(即使使用汇编程序),我猜您没有使用超级计算机进行此测试:)。我们可以以需要 O(N) 性能的方式实现您的算法。Julia 代码如下所示:
function integration_2d(n, sum=0.0)
h = ? / n
multiplier = 1
for i = 2:2n
z = h * (i - 0.5)
sum = sum + multiplier * cos(z)
if i <= n
multiplier += 1
else
multiplier -= 1
end
end
sum * h * h
end
julia> @time integration_2d(100000)
0.002846 seconds
在我的笔记本电脑上是 0.002846 秒(比您要求的 Fortran 时间快 4 倍以上)(因为您没有提供 Fortran 代码,我无法正确比较同一台机器上的性能)