قياس الأداء باستخدام microbenchmark
قارن إحصائيًا بين تطبيقات متعددة باستخدام microbenchmark()
قياس الأداء باستخدام microbenchmark درس مجاني في R Academy على CoddyKit. هذا هو الدرس 4 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في R Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة R Academy 4 دروس في المجموع.
لماذا microbenchmark؟
تتمتع system.time() بدقة تصل إلى المللي ثانية، ولا يمكن الاعتماد عليها في العمليات السريعة. وتشغّل حزمة microbenchmark التعبيرات مئات المرات، وتتولى مرحلة التهيئة، وتعرض إحصاءات بدقة النانوثانية — مما يجعلها الأداة المناسبة لمقارنة تطبيقات متشابهة.
الاستخدام الأساسي لـ microbenchmark
مرّر تعبيرات مسماة إلى microbenchmark(). ويصبح اسم كل وسيطة تسميةً لها في الناتج. وتتحكم الوسيطة times في عدد مرات تقييم كل تعبير.
# library(microbenchmark)
# x <- 1:10000
#
# microbenchmark(
# loop = {
# s <- 0
# for (v in x) s <- s + v
# },
# vectorized = sum(x),
# times = 200L
# )اختيار الوسيطة times
تمنح التكرارات الأكثر تقديرات أكثر استقرارًا، لكنها تستغرق وقتًا أطول. الإرشادات العامة:
- التعبيرات السريعة (الميكروثانية):
times = 1000Lأو أكثر - التعبيرات المتوسطة (المللي ثانية):
times = 100L - التعبيرات البطيئة (الثواني):
times = 10Lأو أقل
القيمة الافتراضية هي times = 100L، وهي نقطة بداية جيدة.
# library(microbenchmark)
# microbenchmark(
# fast_op = sqrt(2),
# times = 10000L # many reps for a nanosecond-scale operation
# )
# microbenchmark(
# slow_op = sort(rnorm(1e6)),
# times = 10L # fewer reps for second-scale operation
# )تحديد الوسيطة unit
استخدم الوسيطة unit لعرض النتائج بمقياس مناسب:
'ns'— نانوثانية (للعمليات السريعة جدًا)'us'— ميكروثانية'ms'— مللي ثانية's'— ثوانٍ'relative'— نسبة إلى التعبير الأسرع
# library(microbenchmark)
# x <- runif(1000)
#
# microbenchmark(
# sapply_sqrt = sapply(x, sqrt),
# vectorized = sqrt(x),
# times = 500L,
# unit = 'us' # display in microseconds
# )تفسير ناتج الملخص
يطبع microbenchmark جدول ملخص يتضمن الأعمدة التالية:
- min — أسرع تشغيل منفرد
- lq / mean / median / uq — الربيع الأدنى، والمتوسط، والوسيط، والربيع الأعلى
- max — أبطأ تشغيل منفرد
- neval — عدد التقييمات
استخدم median مقياسًا أساسيًا للمقارنة — فهو لا يتأثر كثيرًا بعمليات إيقاف جمع القمامة (GC) العرضية التي ترفع قيمتي max وmean.
# Example summary output (unit: microseconds):
#
# expr min lq mean median uq max neval
# loop 1203.1 1245.3 1301.7 1262.4 1310.1 2100.8 100
# vectorized 2.1 2.3 2.9 2.4 2.6 18.3 100
#
# => vectorized is ~525x faster at median
cat('Always compare medians, not means, for microbenchmark results
')الدالة summary() على كائن microbenchmark
يعيد استدعاء summary(mb) على نتيجة microbenchmark مخزنة إطارَ بيانات يمكنك فحصه برمجيًا. ويمكنك أيضًا تغيير unit في استدعاء الملخص.
# library(microbenchmark)
# x <- rnorm(5000)
# mb <- microbenchmark(
# vapply_abs = vapply(x, abs, numeric(1)),
# base_abs = abs(x),
# times = 200L
# )
# s <- summary(mb, unit = 'ms')
# print(s[, c('expr', 'min', 'median', 'max')])استخدام autoplot() للمقارنة المرئية
تستخدم autoplot(mb) مكتبة ggplot2 لرسم مخطط كمان أو مخطط صندوقي لتوزيعات أزمنة التنفيذ عبر التعبيرات. ويسهّل ذلك رؤية الفروق في الوسيط، إضافةً إلى التباين والتداخل بين البدائل.
# library(microbenchmark)
# library(ggplot2)
#
# x <- 1:50000
# mb <- microbenchmark(
# loop = { s <- 0; for (v in x) s <- s + v },
# vapply = vapply(x, identity, numeric(1)),
# vec = sum(x),
# times = 100L
# )
# autoplot(mb) # opens ggplot2 violin chartمقارنة for loop بـ vapply وsapply
اختبار معياري شائع: تطبيق دالة على العناصر واحدًا تلو الآخر باستخدام حلقة for أو sapply() أو vapply(). تكون vapply() أسرع من sapply() لأنها تحجز متجه النتائج مسبقًا. وكلتاهما أبطأ من الكود المتجه بالكامل.
# library(microbenchmark)
# x <- runif(5000, 1, 100)
#
# mb <- microbenchmark(
# for_loop = {
# r <- numeric(length(x))
# for (i in seq_along(x)) r[i] <- log(x[i])
# },
# sapply_log = sapply(x, log),
# vapply_log = vapply(x, log, numeric(1)),
# vec_log = log(x),
# times = 200L, unit = 'us'
# )
# print(mb)التحقق من الصحة أولًا
قبل إجراء الاختبار المعياري، تحقّق من أن جميع التعبيرات تعيد نتائج متطابقة. فالتطبيق الأسرع لكنه غير الصحيح عديم الفائدة. استخدم identical() أو all.equal() لمقارنة المخرجات.
# x <- runif(1000)
# r1 <- sapply(x, sqrt)
# r2 <- sqrt(x)
# r3 <- vapply(x, sqrt, numeric(1))
#
# stopifnot(isTRUE(all.equal(r1, r2)))
# stopifnot(isTRUE(all.equal(r1, r3)))
# cat('All three produce identical results -- safe to benchmark
')
cat('Always verify correctness before comparing speed
')إجراء الاختبار المعياري باستخدام setup
استخدم الوسيطة setup لتشغيل الكود مرة واحدة قبل التعبيرات التي سيُقاس زمنها. ويمنع ذلك احتساب وقت إنشاء البيانات ضمن الاختبار عندما لا يكون إنشاء البيانات هو ما تقيسه.
# library(microbenchmark)
#
# microbenchmark(
# sort_base = sort(x),
# sort_order = x[order(x)],
# setup = { x <- rnorm(10000) },
# times = 100L
# )
# Each iteration refreshes x via setup, then times sort_base and sort_orderالإبلاغ عن الاختبارات المعيارية في التحليل
عند مشاركة نتائج الاختبارات المعيارية، اذكر دائمًا:
- إصدار R والمنصة
- إصدارات الحزم
- قيمة
timesالمستخدمة - حجم البيانات الذي أُجري عليه الاختبار
لا يمكن نقل أزمنة التنفيذ بين الأجهزة — لذا أبلغ عن النسب، لا عن الأرقام المطلقة، عند مقارنة التطبيقات.
cat('R version :', R.version$version.string, '
')
cat('Platform :', R.version$platform, '
')
cat('Logical cores:', parallel::detectCores(), '
')اختبار سريع: مقياس microbenchmark
ما إحصائية الملخص من ناتج microbenchmark الأكثر موثوقية لمقارنة تطبيقين؟
مراجعة microbenchmark
تُعد microbenchmark الأداة القياسية لإجراء الاختبارات المعيارية الدقيقة في R:
- مرّر تعبيرات مسماة واضبط
timesللتحكم في عدد التكرارات - استخدم
unit = 'us'أو'ms'للحصول على ناتج سهل القراءة - قارن الوسيطات — فهي لا تتأثر كثيرًا بالقيم الشاذة الناتجة عن GC
- استخدم
autoplot()لتصور توزيعات أزمنة التنفيذ - تحقّق من الصحة باستخدام
all.equal()قبل إجراء الاختبار المعياري
الأسئلة الشائعة
هل درس «قياس الأداء باستخدام microbenchmark» مجاني؟
نعم — نص درس «قياس الأداء باستخدام microbenchmark» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة R Academy، انتقل إلى CoddyKit PRO. تتضمن دورة R Academy 4 دروس في المجموع.
ماذا ستتعلم في «قياس الأداء باستخدام microbenchmark»؟
قارن إحصائيًا بين تطبيقات متعددة باستخدام microbenchmark() تتمرن على R Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ R Academy؟
لا تُشترط خبرة سابقة. R Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 4 من أصل 4.
كم من الوقت يستغرق درس «قياس الأداء باستخدام microbenchmark»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس R Academy هذا؟
نعم. كل درس في R Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- system.time() وproc.time()
- تحليل أداء التعليمات البرمجية باستخدام Rprof وprofvis
- التوجيهية لتحسين السرعة
- قياس الأداء باستخدام microbenchmark