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

เครื่องมือวิเคราะห์ประสิทธิภาพ

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 หรือ :object
  • out: จะกำหนดเส้นทางไฟล์ดัมป์
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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

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

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