c++ - وعيوب - نسخة linux




كيف يمكنني وضع كود C++ في نظام التشغيل Linux؟ (7)

لدي تطبيق C ++ ، يعمل على Linux ، والذي أنا بصدد تحسينه. كيف يمكنني تحديد مناطق كوداتي التي تعمل ببطء؟


أحدث النواة (على سبيل المثال أحدث حبيبات أوبونتو) تأتي مع أدوات "perfet" الجديدة ( apt-get install linux-tools ) AKA perf_events .

هذه تأتي مع profilers أخذ العينات الكلاسيكية ( man-page ) وكذلك timechart رائع!

الشيء المهم هو أن هذه الأدوات يمكن أن تكون التنميط في النظام وليس مجرد عملية التنميط - يمكن أن تظهر التفاعل بين الخيوط والعمليات والنواة وتتيح لك فهم الجدولة واعتمادات I / O بين العمليات.


أفترض أنك تستخدم دول مجلس التعاون الخليجي. الحل القياسي سيكون ملف تعريف مع gprof .

تأكد من إضافة -pg إلى التصنيف قبل -pg :

cc -o myprog myprog.c utils.c -g -pg

لم google-perftools بعد ، لكنني سمعت أشياء جيدة حول google-perftools . هو بالتأكيد يستحق المحاولة.

سؤال متعلق here .

بعض الكلمات الطنانة الأخرى إذا كان gprof لا يؤدي المهمة نيابة عنك: Valgrind و Intel DTrace Sun DTrace .


الجواب لتشغيل valgrind --tool=callgrind ليست كاملة تماما دون بعض الخيارات. نحن عادة لا نريد أن نحدد 10 دقائق من وقت بدء التشغيل البطيء تحت Valgrind ونريد أن نحدد برنامجنا عندما يقوم ببعض المهام.

لذلك هذا هو ما أوصي به. تشغيل البرنامج الأول:

valgrind --tool=callgrind --dump-instr=yes -v --instr-atstart=no ./binary > tmp

الآن عندما يعمل ويريد البدء في إنشاء ملفات تعريف ، يجب أن نعرض في نافذة أخرى:

callgrind_control -i on

هذا يتحول التنميط. لإيقافها وإيقاف المهمة بالكامل ، قد نستخدمها:

callgrind_control -k

الآن لدينا بعض الملفات المسماة callgrind.out. * في الدليل الحالي. لمعرفة استخدام النتائج التنميط:

kcachegrind callgrind.out.*

أوصي في النافذة التالية بالنقر على رأس العمود "ذاتي" ، وإلا سيظهر أن "main ()" هي المهمة التي تستغرق وقتًا طويلاً. يوضح "الذات" كم تستغرق كل وظيفة وقتًا ، وليس مع المعالين.


لبرامج مترابطة واحدة يمكنك استخدام igprof ، منشئ ملفات التعريف الغني: https://igprof.org/ .

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


هذه هي طريقتين يمكنني استخدامها لتسريع رمز بلدي:

بالنسبة لتطبيقات وحدة المعالجة المركزية (CPU):

  1. استخدم أداة تعريف الصفحات في وضع DEBUG لتحديد الأجزاء المشكوك فيها من التعليمات البرمجية
  2. ثم انتقل إلى وضع RELEASE وقم بالتعليق على الأقسام المشكوك فيها من شفرتك (ضعها بدون أي شيء) حتى ترى تغييرات في الأداء.

بالنسبة للتطبيقات المنضمة إلى I / O:

  1. استخدم أداة تعريف في وضع RELEASE لتحديد الأجزاء المشكوك فيها من التعليمات البرمجية.

NB

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

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

بالنسبة لـ I / O-bound ، لا يزال بإمكان منشئ ملفات التعريف تحديد عمليات الإدخال / الإخراج في وضع RELEASE لأن عمليات الإدخال / الإخراج مرتبطة إما خارجيًا بمكتبة مشتركة (معظم الوقت) أو في الحالة الأسوأ ، سينتج عنها نظام sys- دعوة ناقلات المقاطعة (والتي هي أيضا قابلة للتحديد بسهولة من قبل التعريف).


وأود أن استخدام Valgrind و Callgrind كقاعدة لبلادي أداة مجموعة التنميط. ما هو مهم أن تعرفه هو أن Valgrind هو في الأساس آلة افتراضية:

(wikipedia) تعتبر Valgrind جوهريًا جهازًا افتراضيًا يستخدم تقنيات التجميع في الوقت المناسب (JIT) ، بما في ذلك إعادة التجميع الديناميكي. لا يتم تشغيل أي شيء من البرنامج الأصلي على المعالج المضيف مباشرةً. وبدلاً من ذلك ، يقوم Valgrind بترجمة البرنامج أولاً إلى نموذج مؤقت وبسيط يُسمى "التمثيل الوسيط" (IR) ، وهو نموذج يعتمد على المعالج ولا يعتمد على SSA. بعد التحويل ، تكون أداة (انظر أدناه) مجانية للقيام بأي تحويلات تريدها على الأشعة تحت الحمراء ، قبل أن يقوم Valgrind بترجمة الأشعة تحت الحمراء إلى رمز الجهاز ويسمح للمعالج المضيف بتشغيلها.

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

أداة أخرى تبني على Valgrind هي Massif. أنا استخدمه في ملف تعريف استخدام الذاكرة. إنها تعمل بشكل رائع. ما يفعله هو أنه يعطيك لقطات لاستخدام الذاكرة - معلومات تفصيلية ما يحمل نسبة مئوية من الذاكرة ، وقد وضعتها منظمة الصحة العالمية هناك. تتوفر هذه المعلومات في أوقات مختلفة من وقت تشغيل التطبيق.


استخدم Valgrind و callgrind و kcachegrind:

valgrind --tool=callgrind ./(Your binary)

يولد callgrind.out.x. قراءته باستخدام kcachegrind.

استخدم gprof (add -pg):

cc -o myprog myprog.c utils.c -g -pg 

(ليس جيدًا لمؤشرات الترابط ، مؤشرات الوظائف)

استخدم google-perftools:

يستخدم وقت أخذ العينات ، يكشف عن اختناقات I / O و CPU.

إنتل VTune هو الأفضل (مجاني للأغراض التعليمية).

آخرون: AMD Codeanalyst ، OProfile ، أدوات "perf" (apt-get install linux-tools)





profiling