承接之前的一次讨论:
合理解读效率测试结果 - 综合讨论区 / 心得体会 - Julia中文社区 (juliacn.com)
这个简单的例子中,中英文论坛都有人提到了,返回的是nothing
,所以程序优化之后,什么都不会做。
然而我发现这个优化似乎比较简单。即使我在程序中假如一个无聊的Vector
,假装最后会把循环的结果会赋值给这个Vector
。即使这个Vector
并不输出,它也会认真循环。或者我在循环前面,对某个传入的Vector
进行修改,后面的循环也会认真计算。
using BenchmarkTools
tmp_Vector = zeros(2)
function main1(v) # 矢量无效传入,无效循环。for循环确实没有计算。1.183ns
s = 0
for i in 1:100
s += i
end
end
function main2!(v) # 矢量有效传入,无效循环。但是循环居然也做了计算。14.261 ns
v[1] = 1
s = 0
for i in 1:100
s += i
end
nothing
end
function main3!(v) # 这个是为了和上面对比时间,循环真的做了计算。14.560 ns
v[1] = 1
s = 0
for i in 1:100
s += i
end
v[2] = s
nothing
end
# @benchmark main1(tmp_Vector)
# @benchmark main2!(tmp_Vector)
@benchmark main3!(tmp_Vector)
我之前以为Julia
在编译程序时,对程序的优化非常牛。可以省去一些计算步骤的设计。比如矢量*100个标量
和100个标量*矢量
这种计算顺序的优化,我以为它可以的。然而刚刚试了下,
using BenchmarkTools
v = zeros(10000)
function main1(v)
v * 2 * 3 * 4 * 5 * 6 * 7 * 8 * 9 * 10
end
function main2(v)
2 * 3 * 4 * 5 * 6 * 7 * 8 * 9 * 10 * v
end
@benchmark main1($v)
@benchmark main2($v)
结果其实根本没有。
BenchmarkTools.Trial: 10000 samples with 1 evaluation.
Range (min … max): 59.600 μs … 5.741 ms ┊ GC (min … max): 0.00% … 70.53%
Time (median): 208.700 μs ┊ GC (median): 0.00%
Time (mean ± σ): 220.150 μs ± 333.237 μs ┊ GC (mean ± σ): 16.41% ± 10.76%
▆ ▁█
█▄▃██▄▃▃▂▂▂▂▂▂▂▂▂▂▂▂▂▁▁▁▂▁▁▁▁▁▁▁▁▂▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▂▂▂▂ ▂
59.6 μs Histogram: frequency by time 2.35 ms <
Memory estimate: 703.55 KiB, allocs estimate: 18.
BenchmarkTools.Trial: 10000 samples with 3 evaluations.
Range (min … max): 6.167 μs … 1.597 ms ┊ GC (min … max): 0.00% … 98.21%
Time (median): 23.267 μs ┊ GC (median): 0.00%
Time (mean ± σ): 24.078 μs ± 63.261 μs ┊ GC (mean ± σ): 16.75% ± 6.49%
▁▂▃█▆▂▂▂▂▁ ▁▃▃▃▄█▇▄▂▃▃▂▁▁▁ ▁ ▂
██████████▇▇▇▆█████████████████▇█▇██▇▇▇▆▆▇▆▅▆▇▅▆▇██▇▄▅▄▂▄▄▅ █
6.17 μs Histogram: log(frequency) by time 58.8 μs <
Memory estimate: 78.17 KiB, allocs estimate: 2.
那么Julia是只针对没有矢量参与函数内部计算的特殊情形有优化吗?
如果只对这一种for循环有优化,那么它这么弄的用法在哪里?
如果其它的情形有优化,可以给个链接吗?