0Pricing
R Academy · 강의

microbenchmark로 성능 벤치마킹

microbenchmark()로 여러 구현의 성능을 통계적으로 비교합니다.

microbenchmark로 성능 벤치마킹은(는) CoddyKit의 무료 R Academy 강의입니다. 이것은 4개 중 4번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 R Academy 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. R Academy 강의에는 총 4개의 강의가 포함되어 있습니다.

왜 microbenchmark를 사용할까요?

system.time()은 밀리초 단위의 해상도만 제공하므로 빠른 작업에서는 신뢰하기 어렵습니다. microbenchmark 패키지는 표현식을 수백 번 실행하고, 준비 실행을 처리하며, 나노초 단위의 해상도로 통계를 보고합니다. 따라서 서로 비슷한 구현을 비교하기에 적합한 도구입니다.

microbenchmark 기본 사용법

이름이 지정된 표현식을 microbenchmark()에 전달합니다. 각 인수 이름은 출력에서 레이블이 됩니다. times 인수는 각 표현식을 몇 번 평가할지 지정합니다.

# library(microbenchmark)
# x <- 1:10000
#
# microbenchmark(
#   loop = {
#     s <- 0
#     for (v in x) s <- s + v
#   },
#   vectorized = sum(x),
#   times = 200L
# )

times 인수 선택

반복 횟수가 많을수록 추정값은 안정적이지만 실행 시간이 더 오래 걸립니다. 일반적인 지침은 다음과 같습니다.

  • 빠른 표현식(마이크로초): times = 1000L 이상
  • 중간 속도(밀리초): times = 100L
  • 느린 작업(초): times = 10L 이하

기본값은 times = 100L이며, 좋은 시작점입니다.

# library(microbenchmark)
# microbenchmark(
#   fast_op = sqrt(2),
#   times = 10000L   # many reps for a nanosecond-scale operation
# )
# microbenchmark(
#   slow_op = sort(rnorm(1e6)),
#   times = 10L      # fewer reps for second-scale operation
# )

unit 인수 지정

결과를 보기 편한 단위로 표시하려면 unit 인수를 사용합니다.

  • 'ns' — 나노초(매우 빠른 작업에 사용)
  • 'us' — 마이크로초
  • 'ms' — 밀리초
  • 's' — 초
  • 'relative' — 가장 빠른 표현식에 대한 비율
# library(microbenchmark)
# x <- runif(1000)
#
# microbenchmark(
#   sapply_sqrt = sapply(x, sqrt),
#   vectorized  = sqrt(x),
#   times = 500L,
#   unit = 'us'   # display in microseconds
# )

요약 출력 해석

microbenchmark는 다음 열을 포함한 요약 표를 출력합니다.

  • min — 한 번 실행했을 때의 최솟값
  • lq / mean / median / uq — 하위 사분위수, 평균, 중앙값, 상위 사분위수
  • max — 한 번 실행했을 때의 최댓값
  • neval — 평가 횟수

주요 비교 지표로는 median을 사용하십시오. 일시적인 GC 일시 중지로 인해 max와 mean이 커지는 경우에도 중앙값은 영향을 덜 받습니다.

# Example summary output (unit: microseconds):
#
#         expr    min     lq   mean  median    uq    max neval
#         loop 1203.1 1245.3 1301.7  1262.4 1310.1 2100.8   100
#   vectorized    2.1    2.3    2.9     2.4    2.6   18.3   100
#
# => vectorized is ~525x faster at median
cat('Always compare medians, not means, for microbenchmark results
')

microbenchmark 객체에 summary() 사용

저장된 microbenchmark 결과에 summary(mb)를 호출하면 프로그래밍 방식으로 살펴볼 수 있는 데이터 프레임이 반환됩니다. 요약을 호출할 때 unit도 변경할 수 있습니다.

# library(microbenchmark)
# x <- rnorm(5000)
# mb <- microbenchmark(
#   vapply_abs  = vapply(x, abs, numeric(1)),
#   base_abs    = abs(x),
#   times = 200L
# )
# s <- summary(mb, unit = 'ms')
# print(s[, c('expr', 'min', 'median', 'max')])

시각적 비교를 위한 autoplot()

autoplot(mb)는 ggplot2를 사용하여 표현식별 시간 분포를 바이올린 플롯이나 상자 그림으로 그립니다. 따라서 중앙값의 차이뿐 아니라 대안 간의 변동성과 겹침도 쉽게 확인할 수 있습니다.

# library(microbenchmark)
# library(ggplot2)
#
# x <- 1:50000
# mb <- microbenchmark(
#   loop   = { s <- 0; for (v in x) s <- s + v },
#   vapply = vapply(x, identity, numeric(1)),
#   vec    = sum(x),
#   times  = 100L
# )
# autoplot(mb)  # opens ggplot2 violin chart

반복문, vapply, sapply 비교

대표적인 벤치마크는 for 반복문, sapply() 또는 vapply()를 사용하여 요소별로 함수를 적용하는 작업을 비교하는 것입니다. vapply()는 결과 벡터를 사전 할당하므로 sapply()보다 빠릅니다. 하지만 둘 다 완전히 벡터화된 코드보다는 느립니다.

# library(microbenchmark)
# x <- runif(5000, 1, 100)
#
# mb <- microbenchmark(
#   for_loop = {
#     r <- numeric(length(x))
#     for (i in seq_along(x)) r[i] <- log(x[i])
#   },
#   sapply_log  = sapply(x, log),
#   vapply_log  = vapply(x, log, numeric(1)),
#   vec_log     = log(x),
#   times = 200L, unit = 'us'
# )
# print(mb)

먼저 정확성 확인

벤치마크를 실행하기 전에 모든 표현식이 동일한 결과를 반환하는지 확인하십시오. 더 빠르지만 잘못된 구현은 쓸모가 없습니다. 출력 결과를 비교하려면 identical() 또는 all.equal()을 사용하십시오.

# x <- runif(1000)
# r1 <- sapply(x, sqrt)
# r2 <- sqrt(x)
# r3 <- vapply(x, sqrt, numeric(1))
#
# stopifnot(isTRUE(all.equal(r1, r2)))
# stopifnot(isTRUE(all.equal(r1, r3)))
# cat('All three produce identical results -- safe to benchmark
')
cat('Always verify correctness before comparing speed
')

setup 인수를 사용한 벤치마크

시간을 측정할 표현식을 실행하기 전에 코드를 한 번 실행하려면 setup 인수를 사용하십시오. 측정 대상이 데이터 생성 자체가 아니라면 이렇게 하여 벤치마크에 데이터 생성 시간이 포함되지 않도록 할 수 있습니다.

# library(microbenchmark)
#
# microbenchmark(
#   sort_base  = sort(x),
#   sort_order = x[order(x)],
#   setup = { x <- rnorm(10000) },
#   times = 100L
# )
# Each iteration refreshes x via setup, then times sort_base and sort_order

분석에서 벤치마크 결과 보고

벤치마크 결과를 공유할 때는 항상 다음을 보고하십시오.

  • R 버전과 플랫폼
  • 패키지 버전
  • 사용한 times 값
  • 벤치마크에 사용한 데이터 크기

시간 측정값은 컴퓨터마다 다르므로 구현을 비교할 때는 절대값이 아니라 비율을 보고하십시오.

cat('R version    :', R.version$version.string, '
')
cat('Platform     :', R.version$platform, '
')
cat('Logical cores:', parallel::detectCores(), '
')

빠른 확인: microbenchmark 지표

두 구현을 비교할 때 microbenchmark 출력의 어떤 요약 통계가 가장 신뢰할 만할까요?

microbenchmark 복습

microbenchmark는 R에서 엄밀한 마이크로 벤치마킹을 수행하기 위한 표준 도구입니다.

  • 이름이 지정된 표현식을 전달하고 times를 설정하여 반복 횟수를 조절합니다.
  • 읽기 쉬운 출력에는 unit = 'us' 또는 'ms'를 사용합니다.
  • 중앙값을 비교합니다. 중앙값은 GC 이상값의 영향을 덜 받습니다.
  • autoplot()을 사용하여 시간 분포를 시각화합니다.
  • 벤치마크 전에 all.equal()로 정확성을 확인합니다.

자주 묻는 질문

“microbenchmark로 성능 벤치마킹” 강의는 무료인가요?

네 — “microbenchmark로 성능 벤치마킹” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 R Academy 강의 전체를 잠금 해제할 수 있습니다. R Academy 강의에는 총 4개의 강의가 포함되어 있습니다.

“microbenchmark로 성능 벤치마킹”에서 뭘 배우나요?

microbenchmark()로 여러 구현의 성능을 통계적으로 비교합니다. 브라우저에서 직접 실행하는 실습 코드로 R Academy을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.

R Academy을(를) 시작하는 데 경험이 필요한가요?

사전 경험은 필요하지 않습니다. CoddyKit의 R Academy은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 4번째 강의입니다.

“microbenchmark로 성능 벤치마킹” 강의는 얼마나 걸리나요?

대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.

이 R Academy 강의에서 코드를 작성하고 실행할 수 있나요?

네. 모든 R Academy 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.

이 강의의 모든 강의

  1. system.time()과 proc.time()
  2. Rprof와 profvis로 코드 프로파일링
  3. 속도를 위한 벡터화
  4. microbenchmark로 성능 벤치마킹
← R Academy(으)로 돌아가기