0Pricing
Java Academy · درس

الإحماء والتكرارات

قياس الأداء في الحالة المستقرة

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

الإحماء والتكرارات

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

لماذا نُجري الإحماء

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

@Warmup

يتحكّم @Warmup في المرحلة التجريبية التي يتم تجاهلها: عدد التكرارات ومدة تشغيل كل منها.

import java.util.concurrent.TimeUnit;
import org.openjdk.jmh.annotations.*;

public class Bench {
    @Benchmark
    @Warmup(iterations = 5, time = 1, timeUnit = TimeUnit.SECONDS)
    public int work() {
        return 7 * 6;
    }
}

@Measurement

يتحكّم @Measurement في المرحلة الفعلية التي تُسجّل نتائجها. تؤدي زيادة عدد التكرارات إلى تضييق فاصل الثقة، لكنها تطيل مدة التشغيل.

import java.util.concurrent.TimeUnit;
import org.openjdk.jmh.annotations.*;

public class Bench {
    @Benchmark
    @Measurement(iterations = 10, time = 1, timeUnit = TimeUnit.SECONDS)
    public int work() {
        return 7 * 6;
    }
}

التكرارات مقابل العمليات

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

كم عدد مرات الإحماء الكافي

راقبوا النتائج لكل تكرار. عندما تتوقف تكرارات الإحماء المتتالية عن التغير، يكون JIT قد استقر. وإذا ظلت التكرارات الأولى من القياس تتغير، فأضيفوا مزيدًا من الإحماء. وتُعدّ خمسة تكرارات للإحماء وعشرة تكرارات للقياس نقطة بداية شائعة.

تضيف عمليات التشغيل المنفصلة مزيدًا من الإحماء

كل عملية تشغيل منفصلة هي JVM جديدة تمامًا، ولذلك تكرر كل عملية التشغيل مرحلة الإحماء كاملة. ويؤدي تشغيل عدة عمليات منفصلة إلى عزل ملفات تعريف JIT، كما يتيح معرفة التباين بين JVMs، وهو المقياس الأكثر صدقًا للاستقرار.

import org.openjdk.jmh.annotations.*;

@Fork(3)
@Warmup(iterations = 5)
@Measurement(iterations = 10)
public class Bench {
    @Benchmark
    public double sqrt() {
        return Math.sqrt(2.0);
    }
}

عرض التأثير

تطبع حلقة Java عادية أزمنة كل دفعة. وغالبًا ما تلاحظون أن الدفعات الأولى تعمل ببطء أكبر من اللاحقة بينما يترجم JIT الدالة، وهذا بالضبط هو التأثير الذي يتجاهله الإحماء.

public class Main {
    static long busy(int n) {
        long s = 0;
        for (int i = 0; i < n; i++) s += (long) Math.sqrt(i);
        return s;
    }
    public static void main(String[] args) {
        for (int batch = 0; batch < 5; batch++) {
            long t = System.nanoTime();
            long r = busy(2_000_000);
            System.out.println("batch " + batch + ": "
                + (System.nanoTime() - t) / 1000 + " us, r=" + r);
        }
    }
}

المعتمد على الزمن مقابل المعتمد على العدد

تكون التكرارات افتراضيًا معتمدة على الزمن (تعمل لمدة N من الثواني). ويمكنكم التبديل إلى عدد ثابت من العمليات باستخدام batchSize وأوضاع التشغيل لمرة واحدة، لكن المعتمد على الزمن هو الأسلوب المعتاد لأنه يتكيف مع سرعة الجهاز.

لا تبالغوا في الضبط

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

قراءة الاستقرار

يطبع JMH نتيجة كل تكرار أثناء التشغيل. ويُظهر الاختبار المعياري السليم تلاقي تكرارات الإحماء وتقارب تكرارات القياس بشدة حول النتيجة النهائية، مع خطأ صغير في +/-.

تحقق سريع

تحقّقوا من فهمكم للإحماء والتكرارات.

مراجعة

تعلّمتم كيفية قياس الأداء في الحالة المستقرة:

  • يشغّل @Warmup تكرارات يتم تجاهل نتائجها حتى يتمكن JIT من الترجمة.
  • يشغّل @Measurement تكرارات تُسجّل نتائجها، وتؤدي زيادة عددها إلى تضييق هامش الخطأ.
  • التكرار نافذة زمنية مقيسة، وكل استدعاء داخلها عملية.
  • تكرر عمليات @Fork المتعددة الإحماء في JVMs جديدة وتكشف التباين بين JVMs.
  • استهدفوا نتائج مستقرة قابلة للتكرار بدلًا من إطالة التشغيل إلى أقصى حد.

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

هل درس «الإحماء والتكرارات» مجاني؟

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

ماذا ستتعلم في «الإحماء والتكرارات»؟

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

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

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

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

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

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

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

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

  1. لماذا JMH
  2. كتابة اختبار أداء
  3. الإحماء والتكرارات
  4. تجنب حذف الشيفرة غير المستخدمة
← العودة إلى Java Academy