قياس و اختبار سرعة الكود بروبي

في البرمجة بعد تصحيح كل الأخطاء و التأكد من عمل الكود من الطبيعي أن نفكر بعدها أن الكود جاهز للعمل؛ و لكن عمليا الكود و في كثير من الأحيان يشتغل ببطأ أو يكون أقل فعالة من ما هو منتظر. و رغم التطور الملحوظ من جانب السرعة مع تطور النسخ المختلفة لروبي منذ ال1.8 إلى ال2.0 حاليا إلا اننا سنحتاج لأدوات تسمح لنا بقياس و اختبار سرعة و فعالية الكود كليا أو في بعض أجزاءه.

الbenchmark أو اختبار السرعة يمثل الخطوات المتبعة التي تجعل من الكود أو التطبيق يقوم بعملية أو وظيفة معينة و من خلالها نقوم بقياس سرعة تنفيذ هذه العملية. يمكنكم بعدها و من خلال حساب هذا الوقت تحسين أداء الكود أو البرنامج الخاص بكم و تقليله إلى أبعد حد ممكن.

الطريقة البديهية

للقيام بعملية القياس، ruby يحوي مكتبة تسمى benchmark. هذه المكتبة تتوفر على وظائف عديدة يمكنها قياس سرعة التنفيد للكود كليا. على سبيل المثال :

الخانات و من اليسار تعبر بالترتيب عن :

  • الوقت cpu للمستخدم
  • الوقت cpu للنظام
  • الوقت cpu الكلي
  • الوقت الفعلي (الذي يهمنا كثيرا)

و بما أن الوظيفة measure بامكانها التعامل مع كتل أو مجموعات منفصلة داخل نفس الكود، فإنه بإمكاننا كتابة قياسات بشكل أحسن و أدق مثل ما هو موضح في الكود التالي :

في هذا المثال قمنا بقياس كتلتين مختلفتين داخل نفس الكود، و النتيجة قياسان لكل كتلة كما هو موضح في الصورة:

النتيجة و إن أردنا تحليلها توضح اختلاف صغير بين الوظيفتين : for و times و إن كانت النتيجة توضح أن for تستهلك وقتcpu مستخدم أكثر من times.

الProfilng لاكثر دقة في القياس :

إذا كان الbenchmarking يقوم بقياس الوقت الكلي لتنفيذ أمر ما و مقارنته مع نسخ أخرى للكود، فإن الprofiling هو العملية التي ستعطينا المعلومة التالية : “وقت تنفيذ لكل كود داخل الكود الاجمالي” ، على سببل المثال إذا فرضنا أن في داخل الكود هناك سطر يشوش في أداء البرنامج، باستعمال الprofiling يمكنكم تحديد و مباشرة المشكل الذي يسبب بطأ البرنامج.

ruby يحوي على خاصية الprofiling، ما علينا سوى إضافة :

1
require "profile"

في بداية الكود و انتهى الأمر.

لنأخذ مثال كامل :

النتيجة موضحة في الصورة المرفقة، معلومات كثيرة تمت كتابتها و لكن قراءتها جد سهلة.

الخانة الأولى من اليسار تعبر عن نسبة الوقت المستغرق للوظيفة التي توجد على أقصى اليمين، في المثال الprofiler أخبرنا بأن 100% من الاجمالي لوقت التنفيذ تم استهلاكه من الوظيفة times في الinteger كلاس. الخانة الثانية تمثل الوقت المستغرق بالثواني. الخانة calls تحدد عدد المرات التي ارسلت للوظيفة. في هذه الحالة الوظيفة times تم ارسالها مرتين. خلاصة القول، أنه يمكنكم استعمال نتيجة الprofiler لتحديد نقطة الضعف في الكود و تحسينها.

تقبل الله الصيام والقيام…

التعليقات