using BenchmarkTools
es la forma recomendada de comparar las funciones de Julia A menos que esté cronometrando algo que lleve bastante tiempo, use una @benchmark
o las @btime
macros menos detalladas exportadas desde allí. Debido a que la maquinaria detrás de estas macros evalúa la función de destino muchas veces, @time
es útil para realizar una evaluación comparativa de cosas que se ejecutan lentamente (por ejemplo, cuando se trata de acceso al disco o cálculos que requieren mucho tiempo).
Es importante usarlo @btime
o @benchmark
correctamente, esto evita resultados engañosos. Por lo general, está comparando una función que toma uno o más argumentos. Al realizar evaluaciones comparativas, todos los argumentos deben ser variables externas: (sin la macro de referencia)
x = 1
f(x)
# do not use f(1)
La función se evaluará muchas veces. Para evitar que los argumentos de la función se vuelvan a evaluar cada vez que se evalúa la función, debemos marcar cada argumento con el prefijo $
a al nombre de cada variable que se usa como argumento. Las macros de evaluación comparativa usan esto para indicar que la variable debe evaluarse (resolverse) una vez, al comienzo del proceso de evaluación comparativa y luego el resultado se debe reutilizar directamente como es:
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
Si bien hay parámetros que se pueden ajustar, los valores predeterminados generalmente funcionan bien. Para obtener información adicional sobre BenchmarkTools para ursers experimentados, consulte el manual .
@btime
y@belapsed
solo devuelve el tiempo mínimo.