Как мне сделать правильный микро-тест в Юлии? - PullRequest
0 голосов
/ 20 сентября 2018

Документация Julia 1.0.0 содержит общие советы.

Также предлагается, чтобы вместо использования макроса @time:

Для более серьезного бенчмаркинга, рассмотрим пакет BenchmarkTools.jl, который среди прочего оценивает функцию несколько раз, чтобыуменьшить шум.

Как они сравниваются в использовании и стоит ли использовать что-то не «базовое» Джулия?

1 Ответ

0 голосов
/ 20 сентября 2018

С точки зрения статистики, @benchmark намного лучше, чем @ time

TL; DR Макрос BenchmarkTools @benchmark является отличным инструментом для микро-эталонных тестов.Используйте макрос @time с осторожностью и не воспринимайте первый запуск всерьез.

Этот простой пример иллюстрирует использование и различия:

julia> # Fresh Julia 1.0.0 REPL

julia> # Add BenchmarkTools package using ] key package manager

(v1.0) pkg> add BenchmarkTools  
julia> # Press backspace key to get back to Julia REPL

# Load BenchmarkTools package into current REPL
julia> using BenchmarkTools

julia> # Definine a function with a known elapsed time
julia> f(n) = sleep(n)  # n is in seconds
f (generic function with 1 method)

# Expect just over 500 ms for elapsed time
julia> @benchmark f(0.5)
BenchmarkTools.Trial:
  memory estimate:  192 bytes
  allocs estimate:  5
  --------------
  minimum time:     501.825 ms (0.00% GC)
  median time:      507.386 ms (0.00% GC)
  mean time:        508.069 ms (0.00% GC)
  maximum time:     514.496 ms (0.00% GC)
  --------------
  samples:          10
  evals/sample:     1

julia> # Try second run to compare consistency
julia> # Note the very close consistency in ms for both median and mean times

julia> @benchmark f(0.5)
BenchmarkTools.Trial:
  memory estimate:  192 bytes
  allocs estimate:  5
  --------------
  minimum time:     502.603 ms (0.00% GC)
  median time:      508.716 ms (0.00% GC)
  mean time:        508.619 ms (0.00% GC)
  maximum time:     515.602 ms (0.00% GC)
  --------------
  samples:          10
  evals/sample:     1


julia> # Define the same function with new name for @time macro tests
julia> g(n) = sleep(n)
g (generic function with 1 method)

# First run suffers from compilation time, so 518 ms
julia> @time sleep(0.5)
  0.517897 seconds (83 allocations: 5.813 KiB)

# Second run drops to 502 ms, 16 ms drop
julia> @time sleep(0.5)
  0.502038 seconds (9 allocations: 352 bytes)

# Third run similar to second
julia> @time sleep(0.5)
  0.503606 seconds (9 allocations: 352 bytes)

# Fourth run increases over second by about 13 ms
julia> @time sleep(0.5)
  0.514629 seconds (9 allocations: 352 bytes)

Этот простой пример иллюстрирует, насколько легкоиспользуйте макрос @benchmark и предостережение, с которым следует брать результаты макроса @time.

Да, стоит использовать макрос @benchmark.

...