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 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.
이 강의의 모든 강의
- system.time()과 proc.time()
- Rprof와 profvis로 코드 프로파일링
- 속도를 위한 벡터화
- microbenchmark로 성능 벤치마킹