using BenchmarkTools
是对Julia函数进行基准测试的推荐方法。除非您要花一些时间来安排时间,否则请使用其中一个@benchmark
或@btime
从中导出的较为详细的宏。因为这些宏后面的机制会多次评估目标函数,@time
所以对于基准测试运行缓慢的事物很有用(例如,涉及磁盘访问或非常耗时的计算)。
使用@btime
或@benchmark
正确使用很重要,这样可以避免产生误导性的结果。通常,您正在对采用一个或多个参数的函数进行基准测试。基准测试时,所有参数都应为外部变量:(无基准宏)
x = 1
f(x)
# do not use f(1)
该功能将被评估多次。为了防止每次对函数参数求值时都重新计算函数参数,我们必须在每个参数前面加上一个前缀$
用作变量的每个变量的名称前来参数。基准测试宏使用它来指示在基准测试过程开始时应对变量进行一次评估(解析),然后按原样直接重用结果:
julia> using BenchmarkTools
julia> a = 1/2;
julia> b = 1/4;
julia> c = 1/8;
julia> a, b, c
(0.5, 0.25, 0.125)
julia> function sum_cosines(x, y, z)
return cos(x) + cos(y) + cos(z)
end;
julia> @btime sum_cosines($a, $b, $c); # the `;` suppresses printing the returned value
11.899 ns (0 allocations: 0 bytes) # calling the function takes ~12 ns (nanoseconds)
# the function does not allocate any memory
# if we omit the '$', what we see is misleading
julia> @btime sum_cosines(a, b, c); # the function appears more than twice slower
28.441 ns (1 allocation: 16 bytes) # the function appears to be allocating memory
# @benchmark can be used the same way that @btime is used
julia> @benchmark sum_cosines($a,$b,$c) # do not use a ';' here
BenchmarkTools.Trial:
memory estimate: 0 bytes
allocs estimate: 0
--------------
minimum time: 12.111 ns (0.00% GC)
median time: 12.213 ns (0.00% GC)
mean time: 12.500 ns (0.00% GC)
maximum time: 39.741 ns (0.00% GC)
--------------
samples: 1500
evals/sample: 999
尽管有一些参数可以调整,但默认值通常效果很好。有关面向经验丰富的使用者的BenchmarkTools的其他信息,请参阅手册。
@btime
并且@belapsed
仅返回最短时间。