在julia中优化代码的一种方法是确保类型的稳定性。如果函数中一些变量的类型不确定,编译器无法对这些变量进行确认,执行效率就会降低。
当函数内部变量的类型是确认时,执行效率会提高
我们来看下面的两个函数func1和func2
下面的代码就是典型的函数内部变量类型“模糊”现象:
因为输出时的数据类型可能是Float,Int,Rational
function func1()
s = rand()
if s > 2/3
return .666667
elseif s > 1/3
return 1//3
else
return 0
end
end
而下面代码的performance就比上面的代码好一些
function func2()
s = rand()
if s > 2/3
return .666667
elseif s > 1/3
return 0.3333333
else
return 0.0
end
end
使用下面的代码进行测试
using BenchmarkTools # 当然你要安装此包
@benchmark func1()
@benchmark func2()
下面给出两个实例
function my_mult1(A)
output = 0
for x in A
output *= x
end
return output
end
function my_mult2(A)
output = zeros(eltype(A)) # eltype()返回参数的数据类型
for x in A
output *= x
end
return output
end
# 下面进行测试
using BenchmarkTools
A = rand(10^3)
@benchmark my_mult1(A)
测试结果如下:
BenchmarkTools.Trial:
memory estimate: 46.88 KiB
allocs estimate: 3000
--------------
minimum time: 22.700 μs (0.00% GC)
median time: 23.801 μs (0.00% GC)
mean time: 31.329 μs (13.79% GC)
maximum time: 3.062 ms (97.99% GC)
--------------
samples: 10000
evals/sample: 1
# 下面测试第二个函数
@benchmark my_mult2(A)
测试结果如下:
BenchmarkTools.Trial:
memory estimate: 16 bytes
allocs estimate: 1
--------------
minimum time: 1.890 μs (0.00% GC)
median time: 1.900 μs (0.00% GC)
mean time: 3.060 μs (0.00% GC)
maximum time: 10.011 ms (0.00% GC)
--------------
samples: 10000
evals/sample: 10
可以看出my_mult1的minimum约是my_mult2的minimum的11倍
最后再介绍一种report执行时间和内存使用情况的函数:btime
A = rand(1000,1000)
function func(A)
s = zeros(eltype(A))
for x in A
s += x
end
end
@btime func(A)
# 结果如下
42.722 ms (1000001 allocations: 91.55 MiB)
# 此文有两个学习点,一是BenchmarkTools的使用,二是了解一种程序的优化方法
Julia:用benchmarkTools检测Performance
最新推荐文章于 2024-06-05 22:38:36 发布