مقدمة: لماذا من المهم تحليل أداء كود C++؟
\nC++ هي واحدة من أسرع لغات البرمجة، ولكن حتى بها يمكن كتابة كود بطيء. غالبًا ما يقضي المطورون ساعات في تحسين أجزاء غير مناسبة من البرنامج، معتمدين على الحدس. تحليل الأداء هو نهج علمي للتحسين: أنت تقيس أين يقضي البرنامج معظم الوقت، وتحسن هذه الأماكن بشكل هادف.
\nبالنسبة لمبرمجي C++ المبتدئين، قد يبدو تحليل الأداء معقدًا، ولكن في الواقع، يمكن إتقان الأدوات الأساسية في أمسية واحدة. في هذه المقالة، سنشرح ثلاث أدوات شائعة: gprof و perf و Valgrind، ونتعلم كيفية تفسير نتائجها.
ما هو تحليل الأداء وما هي الطرق المختلفة؟
\nتحليل الأداء هو جمع بيانات حول عمل البرنامج أثناء تنفيذه. هناك طريقتان رئيسيتان:
\n- \n
- التحليل بالأدوات (Instrumenting profiling) — يتم إضافة "مجسات" خاصة إلى كود البرنامج (مثل
gprof). العيب: يبطئ تنفيذ البرنامج. \n - التحليل بالعينة (Sampling profiling) — على فترات زمنية متساوية "ينظر" إلى البرنامج ويسجل أي دالة يتم تنفيذها حاليًا (مثل
perf). لا يبطئ البرنامج تقريبًا. \n
هناك أيضًا أدوات للبحث عن تسربات الذاكرة (Valgrind) وتحليل ذاكرة التخزين المؤقت. للبدء، يكفي إتقان gprof و perf.
الأداة 1: gprof — كلاسيكيات تحليل الأداء
\ngprof هو محلل أداء مدمج لـ GCC. يعمل على مرحلتين: جمع البيانات وتحليلها.
كيفية استخدام gprof
\nأولاً، قم بتجميع البرنامج مع العلم -pg:
g++ -pg -o my_program my_program.cpp\nقم بتشغيل البرنامج:
\n./my_program\nبعد الانتهاء من التنفيذ، سيظهر ملف gmon.out. الآن قم بتشغيل gprof:
gprof my_program gmon.out > report.txt\nافتح report.txt وانظر إلى الجدول:
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 هو المرشح الرئيسي للتحسين.
نصيحة: بالنسبة للبرامج الصغيرة، gprof مناسب تمامًا. بالنسبة للمشاريع الكبيرة، قد يعطي بيانات غير دقيقة بسبب تحسينات المترجم.
الأداة 2: perf — أداة أخذ عينات قوية لنظام Linux
\nperf هو محلل أداء مدمج في نواة Linux. يعمل بطريقة أخذ العينات ولا يبطئ البرنامج تقريبًا. مثالي لأنظمة الإنتاج.
الاستخدام الأساسي لـ perf
\nقم بتجميع البرنامج مع رموز التصحيح (العلم -g):
g++ -g -o my_program my_program.cpp\nقم بتشغيل تحليل الأداء:
\nperf record ./my_program\nبعد انتهاء عمل البرنامج، انظر إلى التقرير:
\nperf report\nسترى واجهة تفاعلية. بالضغط على دالة، يمكنك رؤية أي أسطر من الكود تم تنفيذها في أغلب الأحيان. مثال على الإخراج:
\nSamples: 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 لجمع بيانات النواة