성능 측정
Benchmark 모듈을 알아봅니다
성능 측정은(는) CoddyKit의 무료 Ruby Academy 강의입니다. 이것은 4개 중 1번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 Ruby Academy 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. Ruby Academy 강의에는 총 4개의 강의가 포함되어 있습니다.
왜 측정하나요?
측정하지 않고 최적화하는 것은 추측에 불과합니다. Ruby 표준 라이브러리의 Benchmark 모듈은 코드를 정확하게 측정합니다.
- 변경하기 전에 느린 부분을 찾습니다
- 구현 방식을 객관적으로 비교합니다
- 성급한 최적화를 피합니다
require 'benchmark'
time = Benchmark.realtime do
1_000_000.times { |i| i * 2 }
end
puts "Took #{time.round(4)}s"Benchmark.measure
Benchmark.measure는 사용자 시간, 시스템 시간, 실제 경과 시간을 보여 주는 보고서를 반환합니다.
- 사용자 시간은 코드에서 CPU를 사용한 시간입니다
- 실제 경과 시간은 벽시계 기준으로 흐른 시간입니다
require 'benchmark'
result = Benchmark.measure do
500_000.times { |i| i.to_s }
end
puts resultBenchmark.bm
Benchmark.bm은 여러 블록을 실행하고 표에 이름을 표시합니다.
- 정렬을 위해 레이블 너비를 전달합니다
- 각
x.report는 한 행입니다
require 'benchmark'
Benchmark.bm(10) do |x|
x.report('to_s:') { 100_000.times { |i| i.to_s } }
x.report('inspect:') { 100_000.times { |i| i.inspect } }
endBenchmark.bmbm
Benchmark.bmbm은 먼저 캐시와 GC를 예열하는 예행 실행을 수행하므로 더 공정한 수치를 제공합니다.
- 첫 번째 실행 결과는 버립니다
- 두 번째 실행이 실제 측정입니다
require 'benchmark'
Benchmark.bmbm do |x|
x.report('sum:') { (1..100_000).sum }
x.report('reduce:') { (1..100_000).reduce(:+) }
end빠른 시간 측정을 위한 realtime
Benchmark.realtime은 벽시계 기준의 초 단위 경과 시간만 부동 소수점 수로 반환합니다.
- 블록 하나의 시간을 측정하는 가장 간단한 방법입니다
- 즉석 확인에 적합합니다
require 'benchmark'
elapsed = Benchmark.realtime do
arr = Array.new(100_000) { rand }
arr.sort
end
puts "Sorted in #{elapsed.round(4)}s"단조 시계
시스템 시계 변경의 영향을 받지 않고 정밀하게 시간을 측정하려면 단조 시계와 함께 Process.clock_gettime을 사용합니다.
- NTP 조정의 영향을 받지 않습니다
- 내장 기능 중 가장 정확한 방법입니다
start = Process.clock_gettime(Process::CLOCK_MONOTONIC)
200_000.times { |i| i * i }
finish = Process.clock_gettime(Process::CLOCK_MONOTONIC)
puts "Elapsed: #{(finish - start).round(4)}s"두 접근 방식 비교하기
벤치마크는 여러 대안을 비교할 때 특히 유용합니다. 동일한 부하에서 두 방법을 모두 실행합니다.
- 측정할 수 있을 만큼 입력 크기를 충분히 크게 유지합니다
- 반복 실행해 잡음을 줄입니다
require 'benchmark'
arr = (1..100_000).to_a
Benchmark.bm(8) do |x|
x.report('map:') { arr.map { |n| n * 2 } }
x.report('each:') { r = []; arr.each { |n| r << n * 2 } }
end마이크로벤치마크 주의하기
아주 작은 벤치마크는 잘못된 판단을 하게 할 수 있습니다.
- JIT와 캐시가 실제 작업 부하를 반영하지 않을 수 있습니다
- 측정 중간에 GC가 실행될 수 있습니다
- 현실적인 데이터 크기를 측정합니다
require 'benchmark'
# Too small to be meaningful
t = Benchmark.realtime { 10.times { |i| i + 1 } }
puts "Misleadingly tiny: #{t}s"초당 반복 횟수
흔히 원하는 것은 처리량인 초당 작업 수입니다. benchmark-ips 젬은 이를 보고하지만, 직접 대략 계산할 수도 있습니다.
- 고정된 시간 구간 동안 반복 횟수를 셉니다
- ips가 높을수록 빠릅니다
deadline = Process.clock_gettime(Process::CLOCK_MONOTONIC) + 0.2
count = 0
while Process.clock_gettime(Process::CLOCK_MONOTONIC) < deadline
count += 1
'hello'.upcase
end
puts "Iterations in 0.2s: #{count}"GC 제어하기
가비지 컬렉터는 결과를 왜곡할 수 있습니다. 더 안정적인 수치를 얻기 위해 잠시 비활성화할 수 있습니다.
- 실행 전에는
GC.disable, 실행 후에는GC.enable을 사용합니다 - 메모리 증가를 피하도록 주의해서 사용합니다
require 'benchmark'
GC.disable
t = Benchmark.realtime { 100_000.times { |i| i.to_s } }
GC.enable
puts "Without GC: #{t.round(4)}s"여러 실행 결과 평균 내기
벤치마크를 여러 번 실행하고 변동을 완화하도록 평균을 냅니다.
- 필요하면 가장 느린 이상치를 버립니다
- 안정성을 위해 중앙값을 보고합니다
require 'benchmark'
times = 3.times.map do
Benchmark.realtime { (1..50_000).map { |n| n * n } }
end
avg = times.sum / times.size
puts "Average: #{avg.round(4)}s"빠른 확인
벤치마크에 대한 지식을 확인합니다.
복습
성능을 측정하는 방법을 배웠습니다.
Benchmark모듈은 코드 실행 시간을 정확하게 측정합니다realtime,measure,bm,bmbm은 서로 다른 용도로 사용됩니다- 정밀한 시간 측정에는 단조 시계를 사용합니다
- 오해를 불러일으키는 마이크로벤치마크를 피하고 GC를 고려합니다
- 여러 번 실행한 결과의 평균을 내 잡음을 줄입니다
다음에는 전용 프로파일링 도구를 사용합니다.
AI 튜터와 함께 Ruby을(를) 배우세요 — 무료
브라우저에서 실제 코드를 작성하고 실행하며, 24/7 AI 튜터로부터 즉각적인 도움을 받고, 웹이나 앱에서 중단한 부분부터 계속 학습하세요.
- 코스
- 29
- 레슨
- 109
자주 묻는 질문
“성능 측정” 강의는 무료인가요?
네 — “성능 측정” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 Ruby Academy 강의 전체를 잠금 해제할 수 있습니다. Ruby Academy 강의에는 총 4개의 강의가 포함되어 있습니다.
“성능 측정”에서 뭘 배우나요?
Benchmark 모듈을 알아봅니다 브라우저에서 직접 실행하는 실습 코드로 Ruby Academy을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.
Ruby Academy을(를) 시작하는 데 경험이 필요한가요?
사전 경험은 필요하지 않습니다. CoddyKit의 Ruby Academy은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 1번째 강의입니다.
“성능 측정” 강의는 얼마나 걸리나요?
대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.
이 Ruby Academy 강의에서 코드를 작성하고 실행할 수 있나요?
네. 모든 Ruby Academy 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.