从全局变量该如何传给函数比较好?继续讨论:
看了英文论坛网友们的争论,再经过测试,实际上不止是帖子里全局变量要声明const
的问题。有两种评论对我非常有启发。一个是让我结合CPU频率去计算它干了什么,一个是说函数最后什么都没有返回,很影响优化。
我去测试了一下,定义4个函数:
function fun1()
s = 0.0
for i in v::Vector{Float64}
s += i
end
s
end
function fun2(x::Vector{Float64})
s = 0.0
for i in x
s += i
end
s
end
function fun3()
s = 0.0
for i in v::Vector{Float64}
s += i
end
end
function fun4(x::Vector{Float64})
s = 0.0
for i in x
s += i
end
end
测试结果如下:
> @btime fun1()
7.775 μs (0 allocations: 0 bytes)
> @btime fun2($v) # 常数声明+知道自己返回什么,两者没有区别
7.775 μs (0 allocations: 0 bytes)
> @btime fun2(v) # 没有常数声明,速度慢一丢丢,但不至于原始帖子好多倍
7.800 μs (0 allocations: 0 bytes)
> @btime fun3()
1.800 ns (0 allocations: 0 bytes)
> @btime fun4($v)
1.900 ns (0 allocations: 0 bytes)
> @btime fun4(v)
5.400 ns (0 allocations: 0 bytes)
至于下面的三个比较更没有参考意义了。因为函数返回的是nothing
,所以函数真的也就没做什么。我的CPU是3.85GHz的,计算下:
\begin{aligned}
1.800ns \sim 6.93周期 \\
1.775\mu s \sim 29933.75周期
\end{aligned}
实际上,只有前三个函数是在正确的做事儿的。后面3个返回nothing的,被优化没了。