using BenchmarkTools
è il modo consigliato per confrontare le funzioni di Julia. A meno che tu non stia programmando qualcosa che impiega un po 'di tempo, usa una @benchmark
o le @btime
macro meno dettagliate esportate da esso. Poiché il macchinario alla base di queste macro valuta molte volte la funzione target, @time
è utile per il benchmarking di cose che funzionano lentamente (ad es. Dove sono coinvolti l'accesso al disco o calcoli che richiedono molto tempo).
È importante utilizzare @btime
o @benchmark
correttamente, questo evita risultati fuorvianti. Di solito, stai confrontando una funzione che accetta uno o più argomenti. Nel benchmarking, tutti gli argomenti dovrebbero essere variabili esterne: (senza la macro benchmark)
x = 1
f(x)
# do not use f(1)
La funzione verrà valutata più volte. Per evitare che gli argomenti della funzione vengano rivalutati ogni volta che la funzione viene valutata, è necessario contrassegnare ciascun argomento anteponendo $
a al nome di ciascuna variabile utilizzata come argomento. Le macro di benchmarking usano questo per indicare che la variabile deve essere valutata (risolta) una volta, all'inizio del processo di benchmarking e quindi il risultato deve essere riutilizzato direttamente così com'è:
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
Mentre ci sono parametri che possono essere modificati, i valori predefiniti di solito funzionano bene. Per ulteriori informazioni su BenchmarkTools per operatori esperti, consultare il manuale .
@btime
e@belapsed
restituisce solo il tempo minimo.