朱莉娅有一种非常奇特的缓慢。例如,通过调用函数来运行 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)
速度减慢也不是边际的,而是速度减慢了很多,下图显示了我运行它的情况。
在我的其他一些代码中,实际上发生了相反的情况,但我只是觉得我错过了 Julia 运行方式的一些基本知识。如何使我的代码保持最佳状态以及为什么存在这些差异?
任何可以在函数外部编写的内容,都可以在函数内部编写。所以就像在 C 中一样,你可以写
function main()
print("Hello World\n")
end
main()
Run Code Online (Sandbox Code Playgroud)
因此,只需假装它是一个 C 程序并将您的内容写入 main() 函数中即可。
为什么在函数外部这么慢,是因为函数内部的任何变量都受到保护,不会被另一个线程或任务更改。因此,每次 for 循环访问全局范围内的 for 循环时,都必须检查其变量的类型,以防万一它被另一个线程或任务更改。为了安全起见,所有这些检查都会减慢速度。
Julia 的第一性能定律是
全球速度缓慢
Julia 文档中的性能提示说
全局变量的值可能会随时发生变化,因此其类型也可能会发生变化。这使得编译器很难使用全局变量来优化代码。变量应该是本地的,或者尽可能作为参数传递给函数。
任何对性能至关重要或正在进行基准测试的代码都应该位于函数内。