القياس الدقيق للأداء باستخدام Google Benchmark
اكتب اختبارات أداء دقيقة وموثوقة باستخدام Google Benchmark، وتجنّب مشكلات القياس.
القياس الدقيق للأداء باستخدام Google Benchmark درس مجاني في C++ Academy على CoddyKit. هذا هو الدرس 4 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في C++ Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة C++ Academy 4 دروس في المجموع.
لماذا نستخدم القياس الدقيق؟
يوضح تحليل الأداء على مستوى التطبيق مواضع استهلاك الوقت. أما القياسات الدقيقة فتقيس شفرات محددة بمعزل عن غيرها، وهي مفيدة لمقارنة الخوارزميات أو التطبيقات.
إعداد Google Benchmark
مكتبة قياس أداء لـ C++ تكاد تكون مقتصرة على ملفات الترويسة، من Google. ثبّتوها عبر vcpkg أو Conan أو apt، واربطوا -lbenchmark.
#include <benchmark/benchmark.h>
static void BM_StringCopy(benchmark::State& state) {
std::string s = "Hello, World!";
for (auto _ : state) {
std::string copy(s);
}
}
BENCHMARK(BM_StringCopy);
BENCHMARK_MAIN();الترجمة والتشغيل
ترجموا البرنامج مع التحسين، واربطوه بمكتبة القياس، ثم شغّلوه.
g++ -O2 -DNDEBUG bench.cpp -lbenchmark -lpthread -o bench
./benchتفسير المخرجات
تطبع المكتبة الزمن لكل تكرار، وعدد التكرارات، ووقت وحدة المعالجة المركزية. قارنوا خط الأساس بالتغييرات المقترحة.
تجنب حيل المحسّن
قد يحذف المحسّن الشفرة غير المفيدة. استخدموا benchmark::DoNotOptimize لإجبار البرنامج على اعتبار النتيجة «مهمة».
for (auto _ : state) {
auto result = expensive_function();
benchmark::DoNotOptimize(result);
}منع عمليات التخزين الميتة
تخبر benchmark::ClobberMemory المترجم بأن حالة الذاكرة قد لوحظت، مما يمنع حذف عمليات التخزين.
قياسات أداء ذات معاملات
اختبروا الدالة نفسها عبر أحجام مختلفة للمدخلات.
static void BM_Sort(benchmark::State& state) {
std::vector<int> v(state.range(0));
std::iota(v.rbegin(), v.rend(), 0);
for (auto _ : state) {
auto copy = v;
std::sort(copy.begin(), copy.end());
}
}
BENCHMARK(BM_Sort)->RangeMultiplier(2)->Range(8, 1<<14);قياسات أداء متعددة الخيوط
اختبروا قابلية التوسع باستخدام معدِّل Threads.
BENCHMARK(BM_ConcurrentMap)->Threads(1)->Threads(4)->Threads(16);عدادات مخصصة
تتبّعوا مقاييس خاصة بالمجال، مثل البايتات/الثانية أو العناصر/الثانية.
state.SetItemsProcessed(state.iterations() * input.size());
state.SetBytesProcessed(state.iterations() * input.size() * sizeof(int));المخرجات الإحصائية
شغّلوا البرنامج باستخدام --benchmark_repetitions=10 للحصول على المتوسط والوسيط والانحراف المعياري. وتعرض المكتبة هذه القيم تلقائيًا.
المشكلات الشائعة
انتبهوا إلى ما يلي:
- حذف المترجم للشفرة «الميتة» ← استخدموا DoNotOptimize
- تأثيرات الإحماء ← قيسوا عددًا كبيرًا من التكرارات
- تغيير تردد وحدة المعالجة المركزية ← ثبّتوا النواة وعطّلوا التعزيز
- تشغيل عمليات أخرى ← أجروا القياس على جهاز هادئ
قراءة الأرقام بتمعّن
قد يكون التحسن بنسبة 5٪ مجرد ضجيج في القياس. أجروا تكرارات متعددة، ولا تثقوا إلا بالفروق ذات الدلالة الإحصائية. وقارنوا النتائج بخط أساس معروف.
البدائل
أدوات أخرى للقياس الدقيق:
- Nonius — أداة قياس أداء لـ C++ مقتصرة على ملفات الترويسة
- Hayai — أقدم لكنها خفيفة
- يوفر Catch2 دعمًا مدمجًا لقياس الأداء
تحقق سريع
لماذا نستخدم benchmark::DoNotOptimize(result) داخل حلقة قياس الأداء؟
مراجعة
استخدموا Google Benchmark لإجراء قياسات دقيقة. امنعوا حيل المترجم باستخدام DoNotOptimize وClobberMemory. واستخدموا قياسات ذات معاملات ومتعددة الخيوط لاستكشاف السلوك عبر المدخلات والتزامن. ولا تثقوا إلا بالفروق ذات الدلالة الإحصائية.
الأسئلة الشائعة
هل درس «القياس الدقيق للأداء باستخدام Google Benchmark» مجاني؟
نعم — نص درس «القياس الدقيق للأداء باستخدام Google Benchmark» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة C++ Academy، انتقل إلى CoddyKit PRO. تتضمن دورة C++ Academy 4 دروس في المجموع.
ماذا ستتعلم في «القياس الدقيق للأداء باستخدام Google Benchmark»؟
اكتب اختبارات أداء دقيقة وموثوقة باستخدام Google Benchmark، وتجنّب مشكلات القياس. تتمرن على C++ Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ C++ Academy؟
لا تُشترط خبرة سابقة. C++ Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 4 من أصل 4.
كم من الوقت يستغرق درس «القياس الدقيق للأداء باستخدام Google Benchmark»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس C++ Academy هذا؟
نعم. كل درس في C++ Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- تخطيطات بيانات ملائمة لذاكرة التخزين المؤقت
- التنبؤ بالتفرّعات والحلقات الساخنة
- التنميط باستخدام perf وvtune وSanitizers
- القياس الدقيق للأداء باستخدام Google Benchmark