0Pricing
Ruby Academy · บทเรียน

การวัดประสิทธิภาพ

มอดูล Benchmark

การวัดประสิทธิภาพ เป็นบทเรียน Ruby Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 1 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน Ruby Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส Ruby Academy มีบทเรียนทั้งหมด 4 บทเรียน

เหตุใดจึงต้องวัด

การปรับประสิทธิภาพโดยไม่วัดผลก็ไม่ต่างจากการเดา โมดูล Benchmark ในไลบรารีมาตรฐานของ Ruby ใช้วัดเวลาในการทำงานของโค้ดได้อย่างแม่นยำ

  • ค้นหาส่วนที่ช้าก่อนแก้ไข
  • เปรียบเทียบการนำไปใช้งานต่าง ๆ อย่างเป็นกลาง
  • หลีกเลี่ยงการปรับประสิทธิภาพก่อนเวลาอันควร
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 ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส Ruby Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส Ruby Academy มีบทเรียนทั้งหมด 4 บทเรียน

คุณจะเรียนรู้อะไรในบทเรียน “การวัดประสิทธิภาพ”

มอดูล Benchmark คุณปฏิบัติ Ruby Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน

คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน Ruby Academy หรือไม่

ไม่จำเป็นต้องมีประสบการณ์มาก่อน Ruby Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 1 จากทั้งหมด 4 บทเรียน

บทเรียน “การวัดประสิทธิภาพ” ใช้เวลานานแค่ไหน

บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย

ฉันเขียนและรันโค้ดในบทเรียน Ruby Academy นี้ได้ไหม

ได้ บทเรียน Ruby Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. การวัดประสิทธิภาพ
  2. เครื่องมือวิเคราะห์ประสิทธิภาพ
  3. การปรับหน่วยความจำให้เหมาะสม
  4. คอขวดที่พบบ่อย
← กลับไปที่ Ruby Academy