
يعرض المنشور تطبيقًا لبرامج الأدوات المدمجة لجمع المعلومات المترية وتجميعها في وقت تشغيل التطبيقات المكتوبة في C / C ++ / C #.
يعتمد جوهر النهج الموضح على إدراج "نقاط التحكم" في رمز البرنامج الخاص بالتطبيق لاستخراج البيانات في وقت تنفيذ المكونات الهيكلية: الطرق والوظائف والكتل {}. يتم تجميع المعلومات المترية المستخرجة في قاعدة بيانات داخلية ، يتم تحويل محتوياتها في نهاية التطبيق إلى نموذج تقرير نصي يتم حفظه في ملف. ترجع ملاءمة استخدام وسائل التحكم المدمج في وقت التنفيذ إلى الحاجة إلى تحديد مجالات المشكلات في الكود ، وتحليل أسباب التدهور المؤقت للتطبيق: كامل أو جزئي ، أو يظهر على مجموعات معينة من بيانات المصدر.
توضح أمثلة التعليمات البرمجية المصدر C ++ / C # المعينة تطبيقات محتملة للنهج الموصوف.
مقدمة
يتضمن تطوير تطبيق برمجي عند كل تكرار (على سبيل المثال ، إصدار الإصدار التالي) لتطويره التطوري الخطوات الأساسية التالية:
- تطوير واختبار الوظيفة ؛
- تعظيم الاستفادة من الموارد المستهلكة من ذاكرة الوصول العشوائي.
- استقرار مقاييس وقت التشغيل.
تتطلب هذه الخطوات عددًا كبيرًا من المطورين ليس فقط الإبداع (مثل تطوير وتنفيذ الخوارزميات الفعالة ، وبناء بنية برمجية مرنة ، وما إلى ذلك) ، ولكن أيضًا العمل الروتيني. تتضمن الفئة الأخيرة أنشطة تهدف إلى تثبيت مقاييس الوقت لتنفيذ التطبيق. في العديد من الحالات ، يعد هذا الإجراء مؤلمًا ، عندما يواجه المطورون تدهورًا ، وهذا نتيجة لتوسيع وظيفة منتج البرنامج ، وإعادة بناء بنية البرنامج ، وظهور مؤشرات ترابط جديدة في التطبيق. في الوقت نفسه ، تتطلب مصادر التدهور جهودًا معينة للكشف عنها ، والتي لا تتحقق فقط من خلال كثرة المطورين ومسؤوليتهم (شرط ضروري) ، ولكن أيضًا من خلال تكوين الأدوات المستخدمة لهذه الأغراض (شرط كافي).
أحد الأساليب الفعالة لحل مشكلة تحليل مقاييس وقت التطبيق هو استخدام منتجات البرمجيات المتخصصة ، على سبيل المثال GNU
gprof . يسمح لك تحليل التقارير التي تم إنشاؤها بواسطة هذه الأدوات بتحديد "الاختناقات" (الأساليب والوظائف الطبقية) ، والتي تمثل مقدارًا كبيرًا من الوقت الذي يستغرقه تنفيذ التطبيق ككل. في الوقت نفسه ، بالتأكيد مؤهل المطورين صحة الوقت الذي يقضيه في تنفيذ الأساليب والإجراءات.
تجدر الإشارة أيضًا إلى أن منتجات البرامج من هذه الفئة ، كقاعدة عامة ، تجري تحليلًا متريًا لوقت تنفيذ رمز البرنامج على مستويات أساليب الفئات والوظائف ، مع تجاهل المستويات الأدنى (ولكن مع ذلك من وجهة نظر تحليل المشكلة):
{...} ، من أجل في حين ، القيام ، حتى ، إذا - آخر ، كتل
محاولة الصيد ، والتي داخلها لا تقل النفقات الهامة وقت التنفيذ.
بعد ذلك ، يتم النظر في المحتوى الرئيسي لأحد الحلول الممكنة لتنفيذ أدوات التحكم في وقت التشغيل المضمنة التي تهدف إلى استخراج وتجميع معلومات مفصلة حول مقاييس الوقت لبنات البرمجيات التي يتم التحكم فيها مع إنشاء تقارير لاحقة للمطورين.
طرق لاسترجاع بيانات وقت التشغيل
يمكن تفسير وظيفة أي تطبيق برنامج على أنه
آلة مجردة مع مجموعة محدودة من
الحالات الفريدة
{St} والانتقالات
{Tr} بينهما.
في إطار هذا النهج ، يجب تفسير أي تدفق للتنفيذ في التطبيق على أنه تسلسل منظم لحالاته والانتقالات بينها. في هذه الحالة ، يتم تنفيذ تقدير تكاليف وقت التنفيذ من خلال جمع مقاييس الوقت على كامل مجموعة الحالات التي تم تمريرها مع تجاهل تكاليف الانتقالات من ولاية إلى أخرى - كقيم لا تذكر.
إن استخراج وتراكم البيانات في وقت تنفيذ التطبيق عند نقاط التحكم المحددة هي المهمة الرئيسية التي يتم حلها بواسطة أدوات التحكم المدمجة الموضحة أدناه.
لكل نقطة توقف المعلن عنها في شفرة المصدر عن طريق وضع
ماكرو
PROFILE_ENTRY C ++ ، يتم تسجيل عدد مقاطعه أثناء تنفيذ التطبيق ، بالإضافة إلى قياس الوقت - إجمالي الوقت الذي كان فيه التطبيق في الحالة من اللحظة التي مرت فيها نقطة التفتيش إلى المستوى التالي من التسلسل الهرمي للبرنامج (بما في ذلك الكتلة ، طريقة الفصل ، الوظيفة ، إلخ) كما هو موضح في الرسم البياني أدناه.
يتم التحكم في نقاط التحكم (التسجيل الأولي وحساب مقاييس وقتهم) بواسطة كائن
"timeManager" ، الذي يتم إنشاؤه في مثيل واحد. يتم تسجيل كل حدث لاجتياز نقطة التحكم بواسطة الكائن
"timeManager" ، وخلاله يتم تسجيله من خلال المقطع الأول
كملاحظات مثل
"registerEntry" .
في كل لحظة تمر من نقطة التحكم ، يتم
إنشاء كائن
timerObject ، وتحديد وقت إنشائه. يتم إصلاح وقت التنفيذ عند نقطة التفتيش عند خروج التطبيق من المستوى الحالي للتسلسل الهرمي للبرنامج. في هذه اللحظة ، يتم إتلاف timerObject الكائن تلقائيًا ، والذي يكون مصحوبًا بحساب "العمر" الخاص به T. ونتيجة لذلك ، يزيد
timeManager من عدد مرات مرور نقطة التفتيش والوقت الذي يقضيه
T. بالنسبة لجميع نقاط التحكم المحددة ، يقوم
timeManager بتجميع البيانات مع الإصدار اللاحق للتقرير عند إنهاء التطبيق.

يوجد أدناه رمز C ++ المصدر الذي يقوم بتنفيذ الأدوات المضمنة للتحكم في وقت تنفيذ التطبيق.
هيكل التطبيق التجريبي موضح أدناه ، يوضح استخدام أدوات التحكم في وقت التشغيل المدمجة كمثال ، وكذلك جدول النتائج التي تم الحصول عليها (للحصول على التفاصيل ، انظر
الملحق 1. رمز المصدر للتطبيق التجريبي ).


القسم
الملحق 2. الكود المصدري لوسائل التحكم المضمن لوقت تنفيذ التطبيق C # يقدم تنفيذ مشابه لوسائل التحكم المدمج في C #.
يستخدم المؤلف أزواجًا من
TimeWatcher.StartWatch () و
TimeWatcher.StopWatch () عند تحديد وقت تنفيذ الأساليب والإجراءات الشاقة (من وجهة نظر حسابية) كجزء من منتج برنامج
Delta Design الذي تم تطويره بواسطة
EREMEX - نظام تصميم بمساعدة الكمبيوتر للمعدات الإلكترونية.
فيما يلي مثال لتقرير موجز عن مقاييس الوقت لإحدى وظائف المنتج المذكور.
استنتاجات موجزة
يمكن استخدام الأدوات الموضحة لجمع البيانات في وقت تنفيذ التطبيق في أجزاء مختلفة من رمز البرنامج الخاص بها ، وهي تسمح على وجه الخصوص بما يلي:
- جمع وتراكم البيانات على المقاييس الزمنية لخيوط التنفيذ في التطبيق ؛
- إجراء تقديرات لوقت تنفيذ رمز البرنامج بدقة إلى بنيات اللغة الأساسية ؛
- إدارة حجم البيانات المستخرجة من خلال تشغيل وإيقاف أدوات التحكم المدمجة في الأقسام المقابلة من تدفقات تنفيذ التطبيق ؛
- تطوير وتطبيق اختبارات الانحدار التي تراقب استقرار (واكتشاف تدهور) مقاييس وقت التطبيق.
في الختام ، تجدر الإشارة إلى أنه خارج نطاق هذا المنشور ، كانت هناك أسئلة حول استخدام أدوات التحكم المضمنة الموصوفة في سياق تطبيقات
multithreading ولم يقدم أي تحليل لدقة البيانات التي تم الحصول عليها عن طريق مقاييس الوقت بأي شكل من الأشكال. هذا الأخير يرجع إلى حقيقة أنه في الممارسة العملية ، عند تحديد أسباب التدهور المؤقت للتطبيق ، تكون البيانات المتعلقة
بالتوزيع النسبي لتكاليف وقت التنفيذ بين مكونات البرنامج للتطبيق ذات صلة في المقام الأول
. في هذا الصدد ، فإن الأسئلة المتعلقة بدقة البيانات التي تم الحصول عليها تتلاشى في الخلفية.
الملحق 1. شفرة المصدر للتطبيق التجريبي
INITIALIZE_PROFILER int main(int argc, char * argv[]) {
الملحق 2. شفرة المصدر للتحكم في وقت التشغيل المدمج في تطبيقات C #