การวัดประสิทธิภาพ
มอดูล 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 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(:+) }
endrealtime สำหรับการจับเวลาอย่างรวดเร็ว
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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ