system.time() وproc.time()
قس زمن التنفيذ والزمن الذي استغرقه المستخدم والنظام لتعبيرات R
system.time() وproc.time() درس مجاني في R Academy على CoddyKit. هذا هو الدرس 1 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في R Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة R Academy 4 دروس في المجموع.
لماذا نقيس الأداء؟
قبل تحسين الشيفرة، تحتاج إلى قياس أدائها. فالتخمين بشأن مواضع البطء يؤدي إلى هدر الجهد. يوفر R أدوات مدمجة لتوقيت التعبيرات بدقة.
الأدوات الثلاث الرئيسية هي system.time() وproc.time() وSys.time(). ولكل منها غرض مختلف في تحليل الأداء.
أساسيات system.time()
تقيّم system.time(expr) تعبيرًا وتعيد المدة التي استغرقها تنفيذه. وهي أبسط طريقة لتوقيت عملية واحدة في R.
تكون النتيجة كائنًا من الفئة proc_time، ويحتوي على عناصر مسماة يمكنك فحصها.
result <- system.time({
x <- 1:1000000
total <- sum(x)
})
print(result)قراءة قيم الوقت الثلاث
تعيد system.time() خمس قيم، لكن ثلاثًا منها هي الأهم:
- user — وقت وحدة المعالجة المركزية الذي استخدمته شيفرة R نفسها
- sys — وقت وحدة المعالجة المركزية الذي استخدمه نظام التشغيل نيابةً عن R
- elapsed — الوقت الفعلي المنقضي على الساعة
عادةً ما تكون قيمة الوقت المنقضي هي ما يهمك. وقد يتجاوز مجموع user وsys قيمة elapsed على الأجهزة متعددة الأنوية.
t <- system.time(Sys.sleep(0.1))
cat('user :', t['user.self'], '
')
cat('sys :', t['sys.self'], '
')
cat('elapsed:', t['elapsed'], '
')استخدام proc.time() للتوقيت اليدوي
تعيد proc.time() لقطة للحظية الحالية لزمني وحدة المعالجة المركزية والوقت المنقضي. ومن خلال حفظها قبل كتلة من الشيفرة وبعدها، يمكنك توقيت أي جزء من الشيفرة.
اطرح لقطة البداية من لقطة النهاية للحصول على الوقت المنقضي لذلك القسم.
start <- proc.time()
for (i in 1:100000) sqrt(i)
end <- proc.time()
diff <- end - start
cat('elapsed:', diff['elapsed'], 'seconds
')مكوّنات proc.time()
تعيد proc.time() متجهًا رقميًا مسمى يحتوي على ثلاثة عناصر:
user.self— وقت وحدة المعالجة المركزية للمستخدم الذي استغرَقته عملية Rsys.self— وقت النظام الذي استغرَقته عملية Relapsed— الوقت الفعلي المنقضي منذ بدء تشغيل R
يمنح الفرق بين استدعاءين لـ proc.time() فروقًا زمنية مفيدة.
pt <- proc.time()
cat('Names:', names(pt), '
')
cat('Values:', pt, '
')
cat('Class:', class(pt), '
')استخدام Sys.time() للطوابع الزمنية الفعلية
تعيد Sys.time() التاريخ والوقت الحاليين في صورة كائن POSIXct. وعلى خلاف proc.time()، فهي تمنحك طابعًا زمنيًا واقعيًا، وليس مجرد استخدام وحدة المعالجة المركزية.
يفيد ذلك في تسجيل وقت حدوث شيء ما، وليس فقط المدة التي استغرقها.
start_time <- Sys.time()
cat('Start:', format(start_time), '
')
Sys.sleep(0.05)
end_time <- Sys.time()
cat('End :', format(end_time), '
')استخدام difftime() لقياس الفواصل الزمنية
تحسب difftime(end, start, units='secs') الفرق بين طابعين زمنيين من النوع POSIXct. ويمكنك اختيار الوحدات: 'secs' و'mins' و'hours' و'days'.
يتكامل ذلك طبيعيًا مع Sys.time() لإخراج توقيت واضح وسهل القراءة.
t1 <- Sys.time()
x <- cumsum(1:500000)
t2 <- Sys.time()
delta <- difftime(t2, t1, units = 'secs')
cat('Time taken:', round(as.numeric(delta), 4), 'seconds
')التوقيت داخل حلقة باستخدام replicate()
قد يختلف قياس توقيت واحد بسبب تجميع البيانات المهملة أو جدولة نظام التشغيل. تشغّل replicate(n, system.time(expr)['elapsed']) التعبير عدة مرات وتعيد متجهًا بأزمنة التنفيذ المنقضية.
يمنح أخذ الوسيط لقياسات التوقيت المكررة تقديرًا أكثر استقرارًا.
times <- replicate(10, system.time({
x <- rnorm(10000)
mean(x)
})['elapsed'])
cat('Median elapsed:', median(times), 'seconds
')
cat('Range:', range(times), '
')مقارنة نهجين
استخدم system.time() لمقارنة تطبيقين للمهمة نفسها مباشرةً. يساعدك هذا النمط على التأكد من أن أحد النهجين أسرع قبل اعتماده.
n <- 100000
t_loop <- system.time({
result <- numeric(n)
for (i in seq_len(n)) result[i] <- i^2
})['elapsed']
t_vec <- system.time({
result <- seq_len(n)^2
})['elapsed']
cat('Loop :', t_loop, 's
')
cat('Vector :', t_vec, 's
')
cat('Speedup:', round(t_loop / max(t_vec, 1e-6), 1), 'x
')توقيت العمليات المتداخلة
يمكنك تداخل استدعاءات system.time() أو استخدام نقاط فحص proc.time() داخل سير العمل لتحديد الخطوة التي تمثل عنق الزجاجة.
اطبع الفروق الزمنية الوسيطة أثناء تشغيل البرنامج لبناء مخطط زمني لسير المعالجة.
p0 <- proc.time()
x <- rnorm(200000)
p1 <- proc.time()
y <- sort(x)
p2 <- proc.time()
z <- cumsum(y)
p3 <- proc.time()
cat('Generate:', (p1-p0)['elapsed'], 's
')
cat('Sort :', (p2-p1)['elapsed'], 's
')
cat('Cumsum :', (p3-p2)['elapsed'], 's
')نصائح عملية للتوقيت
ضع هذه الممارسات في اعتبارك عند توقيت شيفرة R:
- شغّل الشيفرة مرة واحدة قبل التوقيت لتسخين JIT وذاكرة التخزين المؤقت للملفات
- استخدم
gc()قبل التوقيت لإعادة ضبط حالة تجميع البيانات المهملة - فضّل الوسيط على المتوسط عبر التكرارات — إذ تؤثر القيم الشاذة الناتجة عن GC في المتوسط
- قِس عنق الزجاجة، لا البرنامج النصي بأكمله
gc() # clear garbage before timing
times <- replicate(5, system.time({
m <- matrix(rnorm(1000 * 1000), nrow = 1000)
crossprod(m)
})['elapsed'])
cat('Median:', median(times), 's
')تحقق سريع: مكوّنات system.time()
أي مكوّن من system.time() يمثل الثواني الفعلية المنقضية على الساعة أثناء التنفيذ؟
مراجعة توقيت الأداء
لديك الآن ثلاث أدوات متكاملة للتوقيت في R الأساسي:
system.time(expr)— أسرع طريقة لتوقيت تعبير واحد؛ وتعيد user وsys وelapsedproc.time()— توقيت قائم على اللقطات لكتل شيفرة عشوائيةSys.time()+difftime()— طوابع زمنية فعلية وفواصل زمنية سهلة القراءة
استخدم replicate() للحصول على قياسات وسيط مستقرة قبل استخلاص استنتاجات بشأن الأداء.
الأسئلة الشائعة
هل درس «system.time() وproc.time()» مجاني؟
نعم — نص درس «system.time() وproc.time()» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة R Academy، انتقل إلى CoddyKit PRO. تتضمن دورة R Academy 4 دروس في المجموع.
ماذا ستتعلم في «system.time() وproc.time()»؟
قس زمن التنفيذ والزمن الذي استغرقه المستخدم والنظام لتعبيرات R تتمرن على R Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ R Academy؟
لا تُشترط خبرة سابقة. R Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 1 من أصل 4.
كم من الوقت يستغرق درس «system.time() وproc.time()»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس R Academy هذا؟
نعم. كل درس في R Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- system.time() وproc.time()
- تحليل أداء التعليمات البرمجية باستخدام Rprof وprofvis
- التوجيهية لتحسين السرعة
- قياس الأداء باستخدام microbenchmark