合理解读效率测试结果

全局变量该如何传给函数比较好?继续讨论:

看了英文论坛网友们的争论,再经过测试,实际上不止是帖子里全局变量要声明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的,被优化没了。

标题有误导性,建议修改

实际上,只有前三个函数是在正确的做事儿的。后面3个返回nothing的,被优化没了。

优化没的原因是函数没有任何影响,做了等于没做

1 个赞

返回 nothing 有时候是为了副作用。
比如 println 的返回就是 nothing (应该是吧)

1 个赞

我修改了标题。函数返回nothing本身并没有问题,不应该仅仅从所有相关的现象推断原因。

1 个赞

是,说的对啊。不过版主帮我改了