当在函数外部时,for 循环在 Julia 中运行速度超级慢

Aak*_*nan 0 for-loop julia

朱莉娅有一种非常奇特的缓慢。例如,通过调用函数来运行 for 循环时

function TestFunc(num)
     for i=1:num
     end
end
Run Code Online (Sandbox Code Playgroud)

它比我只为完全相同的 num 运行 for 循环要快得多......

for i=1:num
end
Run Code Online (Sandbox Code Playgroud)

速度减慢也不是边际的,而是速度减慢了很多,下图显示了我运行它的情况。

For循环代码

在我的其他一些代码中,实际上发生了相反的情况,但我只是觉得我错过了 Julia 运行方式的一些基本知识。如何使我的代码保持最佳状态以及为什么存在这些差异?

Ste*_*iew 5

任何可以在函数外部编写的内容,都可以在函数内部编写。所以就像在 C 中一样,你可以写

function main()
    print("Hello World\n")
end

main()
Run Code Online (Sandbox Code Playgroud)

因此,只需假装它是一个 C 程序并将您的内容写入 main() 函数中即可。

为什么在函数外部这么慢,是因为函数内部的任何变量都受到保护,不会被另一个线程或任务更改。因此,每次 for 循环访问全局范围内的 for 循环时,都必须检查其变量的类型,以防万一它被另一个线程或任务更改。为了安全起见,所有这些检查都会减慢速度。

Julia 的第一性能定律是

全球速度缓慢

Julia 文档中的性能提示说

全局变量的值可能会随时发生变化,因此其类型也可能会发生变化。这使得编译器很难使用全局变量来优化代码。变量应该是本地的,或者尽可能作为参数传递给函数。

任何对性能至关重要或正在进行基准测试的代码都应该位于函数内。