作为物理系的学生,我们主要使用 Fortran 进行计算,但我想尝试一些新的东西,发现了 Julia 以及它解决了其他语言的一些问题的事实,我还发现理论上它和 C 一样快,并且想学习它,但是当我尝试将一些代码从 Fortran 移植到 Julia,但发现速度慢得多。作为初学者,我知道可以进行很多优化。所以我想找出并学习良好的实践和优化来应用代码。
is = zeros(64,64)
kp = zeros(Int8, 1,64)
km = zeros(Int8, 1,64)
for i in 1:64
for j in 1:64
is[i,j] = 1
end
end
for i in 1:63
kp[i] = i+1
end
for i in 2:64
km[i] = i-1
end
kp[64]=1
km[1]=64
for T in 1:500
tr::Float32 = T*0.01
for k in 1:1000
for i in 1:64
for j in 1:64
en :: Float64=-1*is[i,j]*(is[kp[i],j]+is[km[i],j]+is[i,kp[j]]+is[i,km[j]])
den:: Float64=-2*en
if (den<0)
is[i,j]=-1*is[i,j]
end
x:: Float64=rand()
p:: Float64=exp(-den/tr)
if (den >=0)
if (p>x)
is[i,j]=-1*is[i,j]
else
is[i,j]=is[i,j]
end
end
end
end
end
m:: Float64=0.
for i in 1:64
for j in 1:64
m=m+is[i,j]
end
end
m=m/(64*64)
e:: Float64=0.
for i in 1:64
for j in 1:64
ei=-1*is[i,j]*(is[kp[i],j]+is[km[i],j]+is[i,kp[j]]+is[i,km[j]])
e=e+ei
end
end
e=e/2
println(tr, " ", abs(m)," ", e)
end
Run Code Online (Sandbox Code Playgroud)
非常感谢任何帮助
Julia手册的性能提示页面是编写高性能代码的一个很好的参考。如何优化 Julia 代码:实用指南涵盖了手册页中没有的一些内容,包括现在可用于性能监控和调优的更新、更高级的工具。
该文章的脚注还链接到其他有用的博客文章和视频,其中Julia for Data Science 的性能提示页面可能是初学者最容易访问的页面。您可以将其视为 Julia 手册性能提示页面的简化版本,其中涵盖了 Julia 性能方面最重要的、容易实现的成果。这可能是对初学者 Julia 代码中最常见的性能问题以及解决方法进行简洁、可读的概述的最佳起点。
至于这个特定的代码,全局范围内的所有内容可能是问题的一个重要部分,并且很容易解决 - 通过将其包含在函数中然后调用它。
您还可以通过完全避免循环来避免早期循环中的一些边界检查 - is = fill(1, 64, 64), kp = [2:63; 1], km = [64; 1:63]; 尽管这可能不会对这些小数组的性能产生太大影响。迭代列而不是行,即切换嵌套循环中和的
顺序也可能会有所帮助(这一点也适用于 Fortran,因为 Julia 和 Fortran 在存储矩阵时都是以列为主)。for i in 1:64for j in 1:64
为了面向未来,上述脚注中的其他链接是:
和 YouTube 视频