Ruby Academy · 강의

성능 측정

Benchmark 모듈을 알아봅니다

레슨 1/413개 단계

성능 측정은(는) 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 result

Benchmark.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 } }
end

Benchmark.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 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.

이 강의의 모든 강의

  1. 성능 측정
  2. 프로파일링 도구
  3. 메모리 최적화
  4. 흔한 병목
← Ruby Academy(으)로 돌아가기