دليل JMH الشامل لـ Java: اختبارات الأداء مع أمثلة عملية

مدرب بايثون أونلاين للمبتدئين

تعلم Python بسهولة دون إرهاق نظري. حل مهام عملية مع التحقق التلقائي واكتب الكود مباشرة في المتصفح.

ابدأ الدورة

JMH (Java Microbenchmark Harness): الدليل الشامل لاختبار الأداء في Java

JMH (Java Microbenchmark Harness) هي مكتبة لإنشاء وتنفيذ وتحليل اختبارات الأداء الدقيقة (micro-benchmarks) في لغة Java. تم تطويرها بواسطة فريق JVM Performance (بما في ذلك خبراء مثل Alexey Shipilëv)، وتعتبر JMH المعيار الفعلي لقياس أداء أجزاء صغيرة من الكود في نظام Java البيئي.

1. ما هي JMH ولماذا تحتاجها؟

كتابة اختبار أداء صحيح لـ Java ليست مهمة سهلة. يمكن لمُحسِّن JIT (JIT-compiler)، وجامع القمامة (Garbage Collector)، وتحسينات مستوى المعالج (التخزين المؤقت، التنفيذ التخميني)، وحتى ترتيب تنفيذ العمليات أن تشوه النتائج تمامًا. حلقة for بسيطة داخل main غالبًا ما تؤدي إلى قيام JIT-compiler "بإزالة" الكود المختبر باعتباره "ميتًا" (Dead Code Elimination)، وبالتالي فأنت تقيس سرعة حلقة فارغة.

JMH تحل هذه المشكلات تلقائيًا. فهي تدير "التسخين" (Warmup) للكود لتثبيت JIT-compiler، وتمنع تحسين "الكود الميت"، وتدير "التفرعات" (Forks) لعزل JVM، وتقدم نتائج ذات دلالة إحصائية (المتوسط، النسب المئوية، هامش الخطأ).

لماذا يحتاجها المطور؟ لاتخاذ قرارات مدروسة عند اختيار خوارزمية، أو هيكل بيانات، أو طريقة تسلسل، أو تحسين جزء حاسم من الكود، أو مقارنة تطبيقات مختلفة (مثل StringBuilder مقابل String.concat). بدون JMH، أنت تخاطر "بتحسين" شيء ليس في الواقع عنق زجاجة، أو الحصول على نتائج لا يمكن تكرارها في بيئة الإنتاج الفعلية.

2. التثبيت

JMH هي مكتبة لـ Java، لذا لا يتم تثبيتها عبر pip أو npm. الطريقة الأكثر ملاءمة هي استخدام Maven أو Gradle.

الطريقة 1: Maven (موصى بها للبدء السريع)

أنشئ مشروع Maven جديد وأضف إلى pom.xml:

<project>
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.example</groupId>
    <artifactId>jmh-example</artifactId>
    <version>1.0-SNAPSHOT</version>
    <packaging>jmh</packaging>

    <dependencies>
        <dependency>
            <groupId>org.openjdk.jmh</groupId>
            <artifactId>jmh-core</artifactId>
            <version>1.37</version>
        </dependency>
        <dependency>
            <groupId>org.openjdk.jmh</groupId>
            <artifactId>jmh-generator-annprocess</artifactId>
            <version>1.37</version>
            <scope>provided</scope>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.8.1</version>
                <configuration>
                    <source>17</source>
                    <target>17</target>
                </configuration>
            </plugin>
        </plugins>
    </build>
</project>

الطريقة 2: Gradle

plugins {
    id 'java'
    id 'me.champeau.jmh' version '0.7.2'
}

dependencies {
    implementation 'org.openjdk.jmh:jmh-core:1.37'
    annotationProcessor 'org.openjdk.jmh:jmh-generator-annprocess:1.37'
}

jmh {
    jmhVersion = '1.37'
}

الطريقة 3: تحميل JAR (غير موصى به)

يمكنك تحميل fat-jar من GitHub، لكن هذا أقل ملاءمة لإدارة التبعيات.

3. البداية السريعة — مثال عملي بسيط

توصيات