Java Academy · درس

تحديد الاختناقات

قيسوا قبل التحسين

الدرس 1 من 413 خطوة

تحديد الاختناقات درس مجاني في Java Academy على CoddyKit. هذا هو الدرس 1 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في Java Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة Java Academy 4 دروس في المجموع.

قيسوا، ولا تخمّنوا

القاعدة الأولى لتحسين الأداء: قيسوا قبل أن تحسّنوا.

غالبًا ما تكون حدوسكم حول المواضع التي يقضي فيها برنامج Java وقته خاطئة. فالمترجم JIT، وجامع البيانات المهملة، والتخزين المؤقت كلها تجعل التخمينات غير الموثوقة مضللة. حلّلوا الأداء، واعثروا على عنق الزجاجة الحقيقي، ثم أصلحوه.

تعريف عنق الزجاجة

عنق الزجاجة هو الجزء من النظام الذي يحد من معدل الإنتاجية الكلي أو زمن الاستجابة.

لن يفيد تحسين أي جزء آخر بشكل ملحوظ. ويجعل قانون أمدال ذلك دقيقًا: إذا استغرق أحد الأساليب 90% من الوقت، فلن يؤدي تسريع الـ10% الأخرى إلى تحسين يتجاوز 11%.

زمن الاستجابة مقابل الإنتاجية

حددوا ما الذي تريدون تحسينه:

  • زمن الاستجابة — المدة التي يستغرقها طلب واحد.
  • الإنتاجية — عدد الطلبات في الثانية.

وهما يتبادلان الأولوية. فالتنفيذ على دفعات يحسّن الإنتاجية، لكنه قد يزيد زمن استجابة الطلب الواحد. اعرفوا هدفكم قبل الضبط.

قياس الزمن الفعلي

أبسط قياس هو قياس الزمن الفعلي حول كتلة من الشفرة باستخدام System.nanoTime().

وهو مفيد لفحص سريع للمعقولية، لكنه يشمل إحماء JIT، وفترات توقف جامع البيانات المهملة، وضجيج جدولة نظام التشغيل؛ لذلك تعاملوا مع الأرقام المفردة بحذر.

public class Main {
    public static void main(String[] args) {
        long start = System.nanoTime();
        long sum = 0;
        for (int i = 0; i < 10_000_000; i++) sum += i;
        long elapsed = System.nanoTime() - start;
        System.out.println("Sum: " + sum);
        System.out.println("Elapsed ms: " + (elapsed / 1_000_000.0));
    }
}

احذروا إحماء JIT

يبدأ Java بتفسير الشفرة الوسيطة، ثم يترجم JIT الأساليب الساخنة إلى شفرة أصلية.

لذلك تكون التشغيلات الأولى لأسلوب ما أبطأ بكثير من التشغيلات اللاحقة. وتقيس حلقة قياس ساذجة الإحماء في الغالب. تُجري اختبارات الأداء الحقيقية الإحماء أولًا، ثم تقيس الحالة المستقرة؛ وهذا بالضبط ما يفعله JMH نيابةً عنكم.

مقيّد بالمعالج مقابل مقيّد بالإدخال والإخراج

صنّفوا عنق الزجاجة:

  • مقيّد بالمعالج — تنشغل الخيوط بالحساب، وتكون أنوية المعالج مشبعة.
  • مقيّد بالإدخال والإخراج — تنتظر الخيوط القرص أو الشبكة أو قاعدة البيانات.

تميّز أدوات تحليل الأداء بين زمن «on-CPU» وزمن «blocked/waiting». ويختلف الحل تمامًا: خوارزميات أسرع مقابل مزيد من التزامن أو عدد أقل من الرحلات ذهابًا وإيابًا.

أخذ العينات مقابل القياس بالأدوات

هناك استراتيجيتان لتحليل الأداء:

  • أخذ العينات — التقاط تتبعات المكدس دوريًا. تكلفته منخفضة، ونتائجه إحصائية.
  • القياس بالأدوات — إدخال عدادات في كل أسلوب. نتائجه دقيقة، لكنه ثقيل وقد يشوّه أزمنة القياس.

في بيئة الإنتاج، فضّلوا أخذ عينات منخفض التكلفة مثل Java Flight Recorder.

الذاكرة كعنق زجاجة

غالبًا ما تكون التكلفة الحقيقية هي التخصيص لا الحساب. فكثرة إنشاء الكائنات وإتلافها تؤدي إلى تشغيل جامع البيانات المهملة باستمرار، مما يستهلك المعالج ويضيف فترات توقف.

راقبوا معدل التخصيص ووقت GC. وغالبًا ما يتفوق تقليل عمليات التخصيص في حلقة ساخنة على الضبط الدقيق للعمليات الحسابية.

import java.util.ArrayList;
import java.util.List;

public class Main {
    public static void main(String[] args) {
        // Allocation-heavy: a new String each iteration
        List<String> garbage = new ArrayList<>();
        for (int i = 0; i < 5; i++) {
            garbage.add("item-" + i);
        }
        System.out.println("Allocated " + garbage.size() + " strings");
        System.out.println("In a hot loop, this churn drives GC pressure");
    }
}

اعثروا على أعلى المكدس

ينتج محلل أخذ العينات قائمة بالأساليب مرتبة حسب عدد مرات ظهورها في مكدس المعالج — أي الوقت الذاتي.

الأسلوب الموجود في القمة هو مرشحكم. لكن تحققوا من وجوده في مسار التنفيذ الحرج؛ فقد لا يؤثر أسلوب ساخن يعمل داخل مسجّل في الخلفية في زمن الاستجابة الذي يراه المستخدم.

حدّدوا خط الأساس

قبل تغيير أي شيء، سجّلوا قياسًا يمثل خط الأساس في ظل حمل واقعي.

بعد كل تغيير، أعيدوا القياس وقارنوا النتائج. فمن دون خط أساس، لا يمكنكم إثبات أن التحسين أفاد؛ بل إن كثيرًا من «التحسينات» تزيد الأمور سوءًا. غيّروا شيئًا واحدًا في كل مرة.

تحليل الأداء تحت حمل واقعي

قد لا يكون عنق الزجاجة الذي تكتشفونه على حاسوب محمول في وضع الخمول هو نفسه الذي يسبب الضرر في بيئة الإنتاج.

  • استخدموا أحجام بيانات وتزامنًا مماثلين للواقع.
  • حاكوا عبء العمل الذي يهم المستخدمين فعليًا.

قد توجهكم الاختبارات المصغرة الاصطناعية إلى أسلوب لا صلة له بالأداء على نطاق واسع. حللوا الأداء حيث تظهر المشكلة فعليًا.

تحقق سريع

لماذا تكون قياسات زمن أسلوب Java المنفردة والساذجة باستخدام System.nanoTime() مضللة غالبًا؟

خلاصة

العثور على أعناق الزجاجة بطريقة منضبطة:

  • قيسوا الأداء قبل التحسين؛ فالحدس قد يضللكم.
  • حددوا هدفًا: زمن الاستجابة أو الإنتاجية.
  • صنفوا المشكلة إلى مقيّدة بالمعالج أو مقيّدة بـ IO؛ وراقبوا GC والتخصيص.
  • فضلوا محللات الأداء منخفضة الحمل الإضافي التي تعتمد على أخذ العينات.
  • احذروا الإحماء الذي يجريه JIT؛ أنشئوا خط أساس وغيّروا شيئًا واحدًا في كل مرة.
البدء مجانًا

تعلم Java مع معلم ذكاء اصطناعي — مجانًا

اكتب وقم بتشغيل أكوادك الفعلية في المتصفح، واحصل على مساعدة فورية من معلم ذكاء اصطناعي متاح 24/7، واستمر من حيث توقفت على الويب أو في التطبيق.

الدورات
104
الدروس
374

الأسئلة الشائعة

هل درس «تحديد الاختناقات» مجاني؟

نعم — نص درس «تحديد الاختناقات» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة Java Academy، انتقل إلى CoddyKit PRO. تتضمن دورة Java Academy 4 دروس في المجموع.

ماذا ستتعلم في «تحديد الاختناقات»؟

قيسوا قبل التحسين تتمرن على Java Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.

هل أحتاج إلى خبرة سابقة لأبدأ Java Academy؟

لا تُشترط خبرة سابقة. Java Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 1 من أصل 4.

كم من الوقت يستغرق درس «تحديد الاختناقات»؟

معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.

هل يمكنني كتابة وتشغيل أكواد في درس Java Academy هذا؟

نعم. كل درس في Java Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.

جميع الدروس في هذه الدورة

  1. تحديد الاختناقات
  2. Java Flight Recorder
  3. التحليل باستخدام JDK Mission Control
  4. أعلام ضبط JVM الشائعة
← العودة إلى Java Academy