logo

줄리아에서 코드 성능 평가, 벤치마크 하는 법 📂줄리아

줄리아에서 코드 성능 평가, 벤치마크 하는 법

개요

줄리아를 사용하는 가장 큰 이유가 속도, 성능인만큼 공학적으로 최적화된 코드를 작성하는 일은 대단히 중요하다. BenchmarkTools.jl은 쉽고 편리하면서도 정확한 성능을 평가하는 인터페이스를 제공한다1.

코드

julia> sinpi(0.5), cospi(0.5)
(1.0, 0.0)

julia> sincospi(0.5)
(1.0, 0.0)

예로써 sincospi로 한 번에 수치를 계산하는 것과 sinpi, cospi를 따로 사용해서 계산하는 방법 간의 성능을 비교해보자.

@btime

평가 결과 sincospisinpi 하나만을 계산하는 상황에서는 느리지만 cospi까지 따로 계산하는 것보다는 빠르다는 것을 알 수 있다. 이러한 평가 결과는 @time과 달리 단 한 번의 실행이 아니라 자체적으로 반복 측정한 것이므로 더욱 정확하고 신뢰할 수 있다.

julia> x = rand()
0.49058418112141866

julia> @btime SC = sincospi($x);
  7.500 ns (0 allocations: 0 bytes)

julia> @btime S = sinpi($x);
  4.500 ns (0 allocations: 0 bytes)

julia> @btime SC = sinpi($x), cospi($x);
  8.300 ns (0 allocations: 0 bytes)

여기서 변수 x 앞에 $을 두는 이유는 벤치마크에서 x가 전역변수로써 참조되어 성능 그 자체가 아닌 오버헤드를 측정하는 것을 방지하기 위함이다. 이를 통해 x는 벤치마크 전에 미리 계산되어 벤치마크에 사용된다.

@benchmark

더욱 디테일한 성능 평가 결과를 보기 위해서는 @benchmark 매크로를 사용한다. 다음과 같이 히스토그램을 포함해 시각적으로도 더 뛰어난 결과 분석을 출력해준다.

@time, @elapsed와의 차이점

@btime은 정확히 성능을 평가하려는 의도를 가지고 있지만, @time은 단순하게 시간을 측정할 뿐이고 @elapsed는 그 시간을 Float64로 리턴한다는 차이가 있다.

성능이 뛰어난 코드를 작성하기 위해 @time로 코드가 실행되는 시간을 측정하는 습관 자체는 매우 바람직하지만2, 근본적으로 @time은 컴파일 시간부터 온갖 오버헤드를 포함하고 있다. 정직하게 들어간 시간은 정확하게 파악할 수 있으나 코드 자체의 성능을 평가하는 것으로 볼 수는 없다.

전체 코드

sinpi(0.5), cospi(0.5)
sincospi(0.5)

using BenchmarkTools
x = rand()
@btime SC = sincospi($x);
@btime S = sinpi($x);
@btime SC = sinpi($x), cospi($x);
@benchmark SC = sincospi($x)
@benchmark SC = sinpi($x), cospi($x)

환경

  • OS: Windows
  • julia: v1.10.0