ما هي الأساليب التي يمكنك استخدامها لمحة التعليمات البرمجية

StackOverflow https://stackoverflow.com/questions/285710

سؤال

وبعض المنصات التي أطور على، لم يكن لديك أدوات التنميط. أنا أبحث عن اقتراحات / التقنيات التي استخدمتها شخصيا لمساعدتك على تحديد النقاط الساخنة، دون استخدام التعريف.

واللغة المستهدفة هي C ++.

وأنا مهتم في ما كنت قد استخدمت شخصيا.

هل كانت مفيدة؟

المحلول

ولقد وجدت ما يلي مفيدة للغاية:

#ifdef PROFILING
# define PROFILE_CALL(x) do{ \
    const DWORD t1 = timeGetTime(); \
    x; \
    const DWORD t2 = timeGetTime(); \
    std::cout << "Call to '" << #x << "' took " << (t2 - t1) << " ms.\n"; \
  }while(false)
#else
# define PROFILE_CALL(x) x
#endif

والتي يمكن استخدامها في استدعاء الدالة على هذا النحو:

PROFILE_CALL(renderSlow(world));
int r = 0;
PROFILE_CALL(r = readPacketSize());

نصائح أخرى

ولا نكتة: بالإضافة إلى توقيت الإغراق إلى الأمراض المنقولة جنسيا :: cout وغيرها من النصوص / البيانات الموجهة النهج أود أيضا أن استخدام وظيفة الصفارة (). هناك شيء عن سماع الفجوة الصمت بين نقطتي تفتيش "الصفارة" التي تجعل نوعا مختلفا من الانطباع.

وانها مثل الفرق بين النظر إلى الموسيقى ورقة مكتوبة، والسمع في الواقع الموسيقى. انها مثل الفرق بين قراءة RGB (255،0،0) ورؤية محرك النار الحمراء.

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

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

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

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

إذا هو شيء طويلة بما فيه الكفاية في مدة (أ سبيل المثال دقيقة أو أكثر)، وتشغيل البرنامج في مصحح ثم كسر عدة مرات وترى فيها فواصل المصحح، وهذا يعطي فكرة تقريبية جدا من ما هو البرنامج حتى ل(على سبيل المثال إذا كنت كسر 10 مرات وأنهم جميعا في نفس المكان، وهذا يخبرك شيئا للاهتمام!). صعبة للغاية وجاهزة ولكن لا يتطلب أي أدوات، والأجهزة الخ.

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

وأود أن استخدام قاعدة 80/20 ووضع توقيت حول النقاط الساخنة أو مسارات دعوة مثيرة للاهتمام. يجب أن يكون لديك فكرة عامة حيث الاختناقات ستكون (أو على الأقل الغالبية العظمى من مسارات التنفيذ) واستخدام منصة مناسبة تعتمد عالية الدقة الموقت (QueryPerformanceCounters، gettimeofday، الخ.).

وأنا عادة لا تهتم بأي شيء عند بدء التشغيل أو إيقاف (إلا إذا اقتضت الحاجة) ويكون قد واضحة المعالم "نقاط الاختناق"، عادة رسالة عابرة أو نوعا من الحساب حسابي. لقد وجدت عموما هذه الرسالة المصارف / جمعية الهلال الأحمر السوداني (المصارف moreso)، طوابير، كائنات المزامنة، وعادل سهل الفوضى الناشئة (الخوارزميات، حلقات) تمثل عادة لأكثر من الكمون في مسار التنفيذ.

هل باستخدام Visual Studio؟

ويمكنك استخدام / غ و / مفاتيح GH. وإليك مثال تنطوي على تفتيش كومة

وهذه العلامات تسمح لك، من خلال أساس ملف تلو ملف، لتسجيل وظائف غير مزخرفة التي تسمى في كل مرة يتم إدخال طريقة و / أو يقم في وقت التشغيل.

ويمكنك بعد ذلك تسجيل جميع الأوقات من التنميط المعلومات، ليس فقط توقيت المعلومات. المكدس مقالب، داعيا عنوان، عنوان المرسل، الخ وهو أمر مهم، لأنك قد ترغب في معرفة أن "وظيفة X استخدام الوقت Y تحت وظيفة Z 'وليس فقط في الوقت الاجمالي الذي قضي في وظيفة X.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top