التنبؤ بالتفرّعات والحلقات الساخنة
ساعد وحدة المعالجة المركزية على التنبؤ بالتفرّعات، واكتب حلقات يستطيع المترجم تحسينها.
التنبؤ بالتفرّعات والحلقات الساخنة درس مجاني في C++ Academy على CoddyKit. هذا هو الدرس 2 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في C++ Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة C++ Academy 4 دروس في المجموع.
متنبئ التفرعات
تتنبأ وحدات المعالجة المركزية الحديثة بالتعليمة التالية قبل انتهاء التعليمة السابقة. وعندما يكون التنبؤ خاطئًا، يتوقف خط الأنابيب، مما يكلّف من 10 إلى 20 دورة.
التفرعات القابلة للتنبؤ
تكون التفرعات التي تسلك اتجاهًا واحدًا تقريبًا دائمًا، أو تتبع نمطًا واضحًا، سهلة التنبؤ. أما التفرعات العشوائية فهي كارثية.
البيانات المرتبة تساعد
غالبًا ما يكون تكرار البيانات المرتبة مع شرط أسرع من تكرار البيانات غير المرتبة، إذ يتعلم المتنبئ النمط.
// Often much faster on sorted data
std::sort(v.begin(), v.end());
int sum = 0;
for (int x : v) {
if (x > 128) sum += x;
}شفرة بلا تفرعات
استبدلوا التفرعات بالعمليات الحسابية متى أمكن. تقيّم وحدة المعالجة المركزية المسارين وتختار بينهما دون تفرع.
// Branchy
int max(int a, int b) { return (a > b) ? a : b; }
// Branchless (often equivalent in machine code)
int max(int a, int b) { return a + (b - a) * (b > a); }std::max خيار أفضل
غالبًا ما تنتج المترجمات الحديثة شفرة بلا تفرعات تلقائيًا. اكتبوا شفرة واضحة ودعوا المحسّن يعمل، لكن افحصوا التفكيك في المسارات الساخنة.
تلميحات likely وunlikely
أضاف C++20 الوسمين [[likely]] و[[unlikely]] لتزويد المترجم بتلميح.
if (error_condition) [[unlikely]] {
handle_error();
}فك حلقات التكرار
يؤدي إنجاز مزيد من العمل في كل تكرار إلى تقليل تواتر التفرعات. تفك المترجمات الحديثة الحلقات من تلقاء نفسها، لذا استخدموا #pragma unroll فقط عندما يثبت القياس فائدته.
تجنب أحمال العمل المختلطة في الحلقات
تؤدي الحلقة التي تتناوب فيها حالتان عشوائيًا إلى إحباط التنبؤ. قسّموا الحلقة إلى حلقتين، واحدة لكل حالة، متى أمكن.
// Slow: random switching
for (auto& x : v) {
if (x.type == A) process_A(x);
else process_B(x);
}
// Faster: partition first
std::partition(v.begin(), v.end(), [](auto& x) { return x.type == A; });
for (size_t i = 0; i < boundary; ++i) process_A(v[i]);
for (size_t i = boundary; i < v.size(); ++i) process_B(v[i]);إدراج الدوال الساخنة
قد يساوي العبء الإضافي لاستدعاء الدالة جسم الدالة في الحلقات الساخنة. تساعد تلميحات inline، بينما يكون __attribute__((always_inline)) (GCC/Clang) أكثر صرامة.
لا تثقوا بالحدس
المترجمات ووحدات المعالجة المركزية ذكية جدًا. قيسوا الأداء قبل تحسينه. فقد تكون النسخة «الواضحة» بلا تفرعات أبطأ من النسخة كثيرة التفرعات بعد أن يتدرب المتنبئ.
SIMD للحلقات الواسعة
يحوّل التوجيه التلقائي إلى متجهات الحلقةَ إلى تعليمات SIMD عندما يستطيع ذلك. استخدموا شفرة نظيفة وأنواعًا بسيطة، وتجنبوا تبعيات البيانات بين التكرارات.
التحسين الموجّه بالملف التعريفي (PGO)
ترجموا البرنامج، وشغّلوه، واجمعوا بيانات الملف التعريفي، ثم أعيدوا ترجمته مع التلميحات. تستخدم المترجمات البيانات لتقديم تنبؤات أفضل حول التفرعات الساخنة.
تحقق سريع
لماذا قد يؤدي ترتيب البيانات قبل حلقة ترشيح إلى تسريع التنفيذ أحيانًا؟
مراجعة
تكلّف التفرعات التي يُساء التنبؤ بها دورات. حافظوا على قابلية التنبؤ بالتفرعات (فالبيانات المرتبة تساعد)، واستخدموا تلميحات likely وunlikely، وقسّموا أحمال العمل للحفاظ على تجانس الحلقات، وثقوا بالمترجم لتحسين الشفرة ما لم يثبت تحليل الأداء خلاف ذلك.
تعلم C++ مع معلم ذكاء اصطناعي — مجانًا
اكتب وقم بتشغيل أكوادك الفعلية في المتصفح، واحصل على مساعدة فورية من معلم ذكاء اصطناعي متاح 24/7، واستمر من حيث توقفت على الويب أو في التطبيق.
- الدورات
- 51
- الدروس
- 203
الأسئلة الشائعة
هل درس «التنبؤ بالتفرّعات والحلقات الساخنة» مجاني؟
نعم — نص درس «التنبؤ بالتفرّعات والحلقات الساخنة» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة C++ Academy، انتقل إلى CoddyKit PRO. تتضمن دورة C++ Academy 4 دروس في المجموع.
ماذا ستتعلم في «التنبؤ بالتفرّعات والحلقات الساخنة»؟
ساعد وحدة المعالجة المركزية على التنبؤ بالتفرّعات، واكتب حلقات يستطيع المترجم تحسينها. تتمرن على C++ Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ C++ Academy؟
لا تُشترط خبرة سابقة. C++ Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 2 من أصل 4.
كم من الوقت يستغرق درس «التنبؤ بالتفرّعات والحلقات الساخنة»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس C++ Academy هذا؟
نعم. كل درس في C++ Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- تخطيطات بيانات ملائمة لذاكرة التخزين المؤقت
- التنبؤ بالتفرّعات والحلقات الساخنة
- التنميط باستخدام perf وvtune وSanitizers
- القياس الدقيق للأداء باستخدام Google Benchmark