using BenchmarkTools
ジュリア関数をベンチマークする推奨方法です。かなり時間がかかる何かを計時しているのでない限り、そこからエクスポートされたどちら@benchmark
か、またはより詳細な@btime
マクロを使用してください。これらのマクロの背後にある機構はターゲット関数を何度も評価するため、@time
実行速度が遅いもの(ディスクアクセスや非常に時間のかかる計算が含まれる場合など)のベンチマークに役立ちます。
@btime
または@benchmark
正しく使用することが重要です。これにより、誤解を招く結果を回避できます。通常、1つ以上の引数を取る関数をベンチマークします。ベンチマークを行う場合、すべての引数は外部変数である必要があります:(ベンチマークマクロなし)
x = 1
f(x)
# do not use f(1)
関数は何度も評価されます。関数が評価されるたびに関数の引数が再評価されない$
ようにするには、引数として使用される各変数の名前の前にa を付けて、各引数にマークを付ける必要があります。ベンチマークマクロは、これを使用して、ベンチマークプロセスの開始時に変数を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
最低限の時間を返します。