قياس الأداء
وحدة Benchmark
قياس الأداء درس مجاني في Ruby Academy على CoddyKit. هذا هو الدرس 1 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 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 تقريرًا عن الزمن المستخدم وزمن النظام والزمن الفعلي.
- الزمن المستخدم هو وقت وحدة المعالجة المركزية في شيفرتك
- الزمن الفعلي هو الزمن المنقضي حسب الساعة
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"التكرارات في الثانية
غالبًا ما تريد قياس معدل الإنتاجية: أي عدد العمليات في الثانية. تعرض gem المسماة 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 في الحسبان
- احسب متوسط عدة عمليات تشغيل لتقليل التشويش
ستستخدم بعد ذلك أدوات متخصصة لتحليل الأداء.
الأسئلة الشائعة
هل درس «قياس الأداء» مجاني؟
نعم — نص درس «قياس الأداء» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة Ruby Academy، انتقل إلى CoddyKit PRO. تتضمن دورة Ruby Academy 4 دروس في المجموع.
ماذا ستتعلم في «قياس الأداء»؟
وحدة Benchmark تتمرن على Ruby Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ Ruby Academy؟
لا تُشترط خبرة سابقة. Ruby Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 1 من أصل 4.
كم من الوقت يستغرق درس «قياس الأداء»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس Ruby Academy هذا؟
نعم. كل درس في Ruby Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.