مشكلة Profiler VC6: استدعاء الوظائف الزائفة

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

  •  02-10-2019
  •  | 
  •  

سؤال

أنا أواجه القضية التالية أثناء توصيف تطبيق تحت VC6. عندما أقوم بتنفيذ التطبيق ، يشير البروفيلر إلى أن طريقة getter البسيطة التي تشبه ما يلي تسمى عدة مئات من الآلاف من المرات:

int SomeClass::getId() const
{
   return m_iId;
};

المشكلة هي هذه الطريقة لا يسمى في أي مكان في تطبيق الاختبار. عندما أقوم بتغيير الكود إلى ما يلي:

int SomeClass::getId() const
{
   std::cout << "Is this method REALLY being called?" << std::endl;
   return m_iId;
};

لم يتضمن البروفيلر أبدًا getId في قائمة الوظائف التي تم استدعاؤها. التعليق على cout وأنا أعود إلى حيث بدأت ، 130+ ألف مكالمة! فقط للتأكد من أنها لم تكن بعض بيانات Profiler المخبأة أو جدول البحث التالف للوظائف ، أقوم بعمل نظيف وإعادة البناء بين كل اختبار. لا تزال نفس النتائج!

أيه أفكار؟

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

المحلول

أعتقد أن ما يحدث هو أن المترجم و/أو الرابط "يتنقل" return m_iId من المحتمل تمامًا أن يكون العديد من getters الأخرى التي تحدث لإعادة عضو في نفس الإزاحة).

في الأساس ، يتم حل مجموعة من الوظائف المختلفة التي تحتوي على تطبيقات رمز الجهاز المتطابقة على نفس العنوان ، مما يربك البروفيل.

قد تكون قادرًا على منع هذا من الحدوث (إذا كانت هذه هي المشكلة) عن طريق إيقاف التحسينات.

نصائح أخرى

أفترض أنك تنطوي على التنميط لأنك تريد معرفة ما إذا كانت هناك طرق لجعل البرنامج يستغرق وقتًا أقل ، أليس كذلك؟ أنت لست فقط التنميط لأنك ترغب في رؤية الأرقام.

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

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

  • بعض البرامج تقضي وقتًا غير ضروري في "النقاط الساخنة". عندما يكون هذا هو الحال ، سترى أن الكود في "نهاية" المكدس (حيث يكون عداد البرنامج) يقوم بعمل لا داعي له.

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

  • غالبًا ما تكون البرامج الكبيرة بطيئة لأن أشجار المكالمات الخاصة بهم تكون كثيفة بلا داع ، وتحتاج إلى تقليم. إذا كان الأمر كذلك ، فسترى الدالة غير الضرورية مكالمات Mid-Stack.

أي رمز تراه في بعض النسبة المئوية من المداخن سوف ، إذا تمت إزالته ، توفر هذه النسبة المئوية من وقت التنفيذ (أكثر أو أقل). لا يمكنك أن تخطئ. هذا مثال, ، على عدة تكرارات ، لتوفير أكثر من 97 ٪.

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