เครื่องมือวิเคราะห์ประสิทธิภาพ
ruby-prof และ stackprof
เครื่องมือวิเคราะห์ประสิทธิภาพ เป็นบทเรียน Ruby Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 2 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน Ruby Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส Ruby Academy มีบทเรียนทั้งหมด 4 บทเรียน
การวัดประสิทธิภาพเทียบกับโพรไฟเลอร์
การวัดประสิทธิภาพบอกคุณว่าใช้เวลานานเท่าใด ส่วนโพรไฟเลอร์บอกว่าเวลาถูกใช้ไปที่ใดภายในสิ่งนั้น
- โพรไฟเลอร์จะแจกแจงเวลาตามเมธอดหรือบรรทัด
- เผยให้เห็นจุดที่ใช้เวลามากซึ่งคุณอาจคาดไม่ถึง
- โพรไฟเลอร์ Ruby ที่ได้รับความนิยม ได้แก่ ruby-prof และ stackprof
# Profilers answer: which method consumed the most time?
puts 'Benchmark = how long, Profiler = where'ภาพรวม ruby-prof
ruby-prof คือโพรไฟเลอร์แบบติดตามรายละเอียด โดยแทรกการติดตามการเรียกเมธอดทุกครั้ง
- นับจำนวนการเรียกและจับเวลาได้แม่นยำมาก
- มีภาระการทำงานสูงกว่า จึงควรใช้กับตัวอย่างที่เป็นตัวแทนของการใช้งานจริง
- ติดตั้งด้วย
gem install ruby-prof
# Gemfile
gem 'ruby-prof'การวิเคราะห์บล็อกด้วย ruby-prof
ห่อโค้ดด้วย RubyProf.profile เพื่อบันทึกผลลัพธ์ที่คุณสามารถพิมพ์แสดงได้
- ส่งคืนออบเจ็กต์ผลลัพธ์ของโพรไฟล์
- ส่งออบเจ็กต์นั้นให้ตัวแสดงผลเพื่อสร้างผลลัพธ์
require 'ruby-prof'
result = RubyProf.profile do
1000.times { |i| (1..i).reduce(:+) }
end
RubyProf::FlatPrinter.new(result).print(STDOUT)ตัวแสดงผลของ ruby-prof
ruby-prof มีตัวแสดงผลหลายแบบสำหรับมุมมองที่แตกต่างกัน
FlatPrinterแสดงรายการเมธอดที่เรียงลำดับแล้วGraphPrinterแสดงความสัมพันธ์ระหว่างผู้เรียกกับผู้ถูกเรียกCallTreePrinterแสดงผลสำหรับ KCachegrind
require 'ruby-prof'
result = RubyProf.profile { 100.times { 'x' * 1000 } }
RubyProf::GraphPrinter.new(result).print(STDOUT, min_percent: 1)การอ่านโพรไฟล์แบบแบน
โพรไฟล์แบบแบนจะแสดงรายการเมธอดตามเวลาที่ใช้
- เวลาของเมธอดเอง (%) คือเวลาที่ใช้ภายในเมธอดนั้นเอง
- เวลารวม รวมเวลาของเมธอดที่ถูกเรียกด้วย
- จำนวนครั้งที่เรียก คือจำนวนครั้งที่ถูกเรียกใช้
เริ่มจากรายการที่มีเวลาของเมธอดเองสูงสุด
# Example flat output columns:
# %self total self wait child calls name
puts 'Optimize the top %self method first'ภาพรวม stackprof
stackprof คือโพรไฟเลอร์แบบสุ่มตัวอย่าง ซึ่งจะบันทึกสแตกการเรียกเป็นระยะ
- มีภาระการทำงานต่ำมาก จึงปลอดภัยสำหรับการใช้งานจริง
- สุ่มตัวอย่างตาม CPU เวลาจริง หรือการจัดสรรออบเจ็กต์
- ติดตั้งด้วย
gem install stackprof
# Gemfile
gem 'stackprof'การเรียกใช้ stackprof
StackProf.run จะวิเคราะห์บล็อกและเขียนผลลัพธ์ลงในไฟล์
mode:สามารถเป็น:cpu,:wallหรือ:objectout:จะกำหนดเส้นทางไฟล์ดัมป์
require 'stackprof'
StackProf.run(mode: :cpu, out: 'profile.dump') do
1_000_000.times { |i| Math.sqrt(i) }
endการตรวจสอบผลลัพธ์ของ stackprof
ใช้เครื่องมือบรรทัดคำสั่ง stackprof เพื่ออ่านไฟล์ดัมป์
stackprof profile.dump --textสำหรับสรุปผล--method Name#methเพื่อเจาะดูเมธอดหนึ่งรายการ--flamegraphเพื่อสร้างข้อมูลกราฟเปลวไฟ
# Shell
# stackprof profile.dump --text
# stackprof profile.dump --method 'Array#sort'
puts 'Analyze the dump with the stackprof CLI'การสุ่มตัวอย่างเทียบกับการติดตามทุกครั้ง
โพรไฟเลอร์ทั้งสองแบบแลกความแม่นยำกับภาระการทำงาน
- ruby-prof ติดตามทุกการเรียกอย่างแม่นยำ แต่ทำงานช้ากว่า
- stackprof สุ่มตัวอย่าง จึงเป็นค่าประมาณแต่ใช้ทรัพยากรต่ำ
- ใช้ stackprof ในการใช้งานจริง และใช้ ruby-prof สำหรับการวิเคราะห์เชิงลึก
modes = { 'ruby-prof' => 'instrumenting', 'stackprof' => 'sampling' }
modes.each { |tool, kind| puts "#{tool}: #{kind}" }เวลาแบบนาฬิกาจริงเทียบกับเวลา CPU
เลือกโหมดการวิเคราะห์ตามจุดคอขวด
- โหมด CPU แสดงโค้ดที่ใช้การประมวลผลหนัก
- โหมดเวลาจริง ยังจับการรอการทำงานนำเข้าและส่งออก เช่น เครือข่ายหรือดิสก์
- จุดปลายทางที่ช้าและเรียกฐานข้อมูลควรใช้โหมดเวลาจริง
# I/O bound? use wall. CPU bound? use cpu.
bottleneck = 'database query'
mode = bottleneck.include?('query') ? :wall : :cpu
puts "Use mode: #{mode}"กระบวนการทำงานของการวิเคราะห์ประสิทธิภาพ
การวิเคราะห์ประสิทธิภาพที่มีประสิทธิผลควรทำเป็นวงจร
- จำลองสถานการณ์ที่ช้าให้เกิดขึ้น
- วิเคราะห์เพื่อค้นหาจุดที่ใช้เวลามาก
- ปรับประสิทธิภาพเฉพาะจุดนั้น
- วิเคราะห์ซ้ำเพื่อยืนยันว่าดีขึ้น
steps = ['reproduce', 'profile', 'optimize hotspot', 're-profile']
steps.each_with_index { |s, i| puts "#{i + 1}. #{s}" }ตรวจสอบความรู้
ทดสอบความรู้เกี่ยวกับการวิเคราะห์ประสิทธิภาพของคุณ
ทบทวน
คุณได้เรียนรู้เกี่ยวกับเครื่องมือวิเคราะห์ประสิทธิภาพดังนี้
- โพรไฟเลอร์แสดงว่าใช้เวลาไปที่ใด ไม่ใช่เพียงใช้เวลานานเท่าใด
ruby-profติดตามทุกการเรียกเพื่อให้รายละเอียดแม่นยำstackprofสุ่มตัวอย่างโดยใช้ทรัพยากรต่ำ จึงปลอดภัยสำหรับการใช้งานจริง- เลือกโหมด CPU หรือเวลาจริงตามจุดคอขวด
- ทำตามวงจรจำลองสถานการณ์ วิเคราะห์ ปรับประสิทธิภาพ และวิเคราะห์ซ้ำ
ถัดไปคุณจะลดการจัดสรรหน่วยความจำ
คำถามที่พบบ่อย
บทเรียน “เครื่องมือวิเคราะห์ประสิทธิภาพ” ฟรีหรือไม่
ใช่ — ข้อความเต็มของ “เครื่องมือวิเคราะห์ประสิทธิภาพ” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส Ruby Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส Ruby Academy มีบทเรียนทั้งหมด 4 บทเรียน
คุณจะเรียนรู้อะไรในบทเรียน “เครื่องมือวิเคราะห์ประสิทธิภาพ”
ruby-prof และ stackprof คุณปฏิบัติ Ruby Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน
คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน Ruby Academy หรือไม่
ไม่จำเป็นต้องมีประสบการณ์มาก่อน Ruby Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 2 จากทั้งหมด 4 บทเรียน
บทเรียน “เครื่องมือวิเคราะห์ประสิทธิภาพ” ใช้เวลานานแค่ไหน
บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย
ฉันเขียนและรันโค้ดในบทเรียน Ruby Academy นี้ได้ไหม
ได้ บทเรียน Ruby Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- การวัดประสิทธิภาพ
- เครื่องมือวิเคราะห์ประสิทธิภาพ
- การปรับหน่วยความจำให้เหมาะสม
- คอขวดที่พบบ่อย