تحليل أداء كود C++: إيجاد نقاط الضعف للمبتدئين

مدرب بايثون أونلاين للمبتدئين

تعلم Python بسهولة دون إرهاق نظري. حل مهام عملية مع التحقق التلقائي واكتب الكود مباشرة في المتصفح.

ابدأ الدورة

مقدمة: لماذا من المهم تحليل أداء كود C++؟

\n

C++ هي واحدة من أسرع لغات البرمجة، ولكن حتى بها يمكن كتابة كود بطيء. غالبًا ما يقضي المطورون ساعات في تحسين أجزاء غير مناسبة من البرنامج، معتمدين على الحدس. تحليل الأداء هو نهج علمي للتحسين: أنت تقيس أين يقضي البرنامج معظم الوقت، وتحسن هذه الأماكن بشكل هادف.

\n

بالنسبة لمبرمجي C++ المبتدئين، قد يبدو تحليل الأداء معقدًا، ولكن في الواقع، يمكن إتقان الأدوات الأساسية في أمسية واحدة. في هذه المقالة، سنشرح ثلاث أدوات شائعة: gprof و perf و Valgrind، ونتعلم كيفية تفسير نتائجها.

\n\n

ما هو تحليل الأداء وما هي الطرق المختلفة؟

\n

تحليل الأداء هو جمع بيانات حول عمل البرنامج أثناء تنفيذه. هناك طريقتان رئيسيتان:

\n
    \n
  • التحليل بالأدوات (Instrumenting profiling) — يتم إضافة "مجسات" خاصة إلى كود البرنامج (مثل gprof). العيب: يبطئ تنفيذ البرنامج.
  • \n
  • التحليل بالعينة (Sampling profiling) — على فترات زمنية متساوية "ينظر" إلى البرنامج ويسجل أي دالة يتم تنفيذها حاليًا (مثل perf). لا يبطئ البرنامج تقريبًا.
  • \n
\n

هناك أيضًا أدوات للبحث عن تسربات الذاكرة (Valgrind) وتحليل ذاكرة التخزين المؤقت. للبدء، يكفي إتقان gprof و perf.

\n\n

الأداة 1: gprof — كلاسيكيات تحليل الأداء

\n

gprof هو محلل أداء مدمج لـ GCC. يعمل على مرحلتين: جمع البيانات وتحليلها.

\n

كيفية استخدام gprof

\n

أولاً، قم بتجميع البرنامج مع العلم -pg:

\n
g++ -pg -o my_program my_program.cpp
\n

قم بتشغيل البرنامج:

\n
./my_program
\n

بعد الانتهاء من التنفيذ، سيظهر ملف gmon.out. الآن قم بتشغيل gprof:

\n
gprof my_program gmon.out > report.txt
\n

افتح report.txt وانظر إلى الجدول:

\n
Flat profile:\nEach sample counts as 0.01 seconds.\n  %   cumulative   self              self     total\n time   seconds   seconds    calls  ms/call  ms/call  name\n 60.00      0.06     0.06    10000     0.01     0.01  slow_function\n 30.00      0.09     0.03     5000     0.01     0.02  medium_function\n 10.00      0.10     0.01        1    10.00    10.00  main
\n

في عمود % time يظهر النسبة المئوية للوقت الذي استغرقته الدالة. في مثالنا، slow_function هو المرشح الرئيسي للتحسين.

\n

نصيحة: بالنسبة للبرامج الصغيرة، gprof مناسب تمامًا. بالنسبة للمشاريع الكبيرة، قد يعطي بيانات غير دقيقة بسبب تحسينات المترجم.

\n\n

الأداة 2: perf — أداة أخذ عينات قوية لنظام Linux

\n

perf هو محلل أداء مدمج في نواة Linux. يعمل بطريقة أخذ العينات ولا يبطئ البرنامج تقريبًا. مثالي لأنظمة الإنتاج.

\n

الاستخدام الأساسي لـ perf

\n

قم بتجميع البرنامج مع رموز التصحيح (العلم -g):

\n
g++ -g -o my_program my_program.cpp
\n

قم بتشغيل تحليل الأداء:

\n
perf record ./my_program
\n

بعد انتهاء عمل البرنامج، انظر إلى التقرير:

\n
perf report
\n

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

\n
Samples: 1K of event 'cycles'\nEvent count (approx.): 250000000\nOverhead  Command      Shared Object     Symbol\n  45.32%  my_program   my_program        [.] slow_function\n  30.15%  my_program   my_program        [.] medium_function\n  12.50%  my_program   libc-2.31.so      [.] malloc\n   8.03%  my_program   my_program        [.] main
\n

هام: يتطلب perf صلاحيات root لجمع بيانات النواة

المدونات

توصيات الكتب