Java Academy · पाठ

JMH क्यों

भोले benchmark की गलतियों से बचें

पाठ 1, कुल 4 में से13 चरण

JMH क्यों, CoddyKit पर Java Academy का एक निःशुल्क पाठ है। यह 4 में से 1वाँ पाठ है। आप नीचे पूरा पाठ निःशुल्क पढ़ सकते हैं—फिर अंतर्निहित कोड संपादक और 24/7 एआई ट्यूटर के साथ ब्राउज़र में इसका व्यावहारिक अभ्यास कर सकते हैं। यह Java Academy सीखने के मार्ग का हिस्सा है और आपकी प्रगति वेब तथा CoddyKit ऐप पर सिंक होती रहती है। Java Academy पाठ्यक्रम में कुल 4 पाठ शामिल हैं।

JMH क्यों

Java माइक्रोबेंचमार्क हार्नेस (JMH) छोटे Java कोड-खंडों के प्रदर्शन को मापने का मानक उपकरण है। हाथ से बनाए गए समय-मापन लूप लगभग हमेशा गलत संख्याएँ देते हैं, क्योंकि JVM एक अत्यंत उन्नत अनुकूलनकारी रनटाइम है।

JMH इन समस्याओं के प्रभाव को समाप्त करने के लिए मौजूद है।

भोला-भाला बेंचमार्क

पहला सामान्य प्रयास किसी लूप को System.nanoTime() में लपेटना होता है। यह उचित लगता है, लेकिन सूक्ष्म-बेंचमार्क के लिए इसमें गंभीर खामियाँ होती हैं।

public class Main {
    static int compute(int n) { return n * n + 7; }
    public static void main(String[] args) {
        long start = System.nanoTime();
        int sink = 0;
        for (int i = 0; i < 1_000_000; i++) sink = compute(i);
        long elapsed = System.nanoTime() - start;
        System.out.println("ns: " + elapsed + " sink=" + sink);
    }
}

समस्या 1: JIT वार्म-अप

JVM शुरुआत में व्याख्यायित मोड में चलता है और हजारों आह्वानों के बाद ही अधिक उपयोग की जाने वाली विधियों को नेटिव कोड में संकलित करता है। भोला-भाला बेंचमार्क धीमे व्याख्यायित चरण और तेज़ संकलित चरण को मिलाकर मापता है, जिससे अर्थहीन औसत प्राप्त होते हैं।

JMH इसे एक अलग वार्म-अप चरण से हल करता है, जिसके परिणाम त्याग दिए जाते हैं।

समस्या 2: मृत-कोड उन्मूलन

यदि किसी गणना किए गए परिणाम का कभी उपयोग न हो, तो JIT उस पूरी गणना को हटा सकता है। तब आपका बेंचमार्क एक खाली लूप को मापता है।

JMH इससे बचने के लिए लौटाए गए मानों का उपभोग और Blackhole उपलब्ध कराता है।

समस्या 3: स्थिरांक फोल्डिंग

यदि इनपुट संकलन-समय के स्थिरांक हों, तो JIT उत्तर की गणना एक बार करके उसका पुनः उपयोग करता है। नीचे दिया गया लूप संकलक द्वारा एकल स्थिरांक से बदला जा सकता है।

JMH @State ऑब्जेक्ट का उपयोग करता है, ताकि अनुकूलक के लिए इनपुट अपारदर्शी रहें।

public class Main {
    public static void main(String[] args) {
        // 2 * 21 is constant; the JIT folds it to 42
        int result = 2 * 21;
        System.out.println(result);
    }
}

समस्या 4: लूप अनुकूलन

JIT लूप को खोलता है, अपरिवर्तनीय कोड को बाहर ले जाता है और संचालन को वेक्टराइज़ करता है। हाथ से लिखा गया लूप उस संचालन के बजाय इन अनुकूलनों को मापता है, जिसे आप वास्तव में जाँचना चाहते थे।

JMH आपके लूप को अपने द्वारा प्रबंधित सावधानी से नियंत्रित पुनरावृत्ति-संख्याओं से बदल देता है।

समस्या 5: ऑन-स्टैक प्रतिस्थापन

main में लंबे समय तक चलने वाले लूप को निष्पादन के बीच में संकलित किया जा सकता है (ऑन-स्टैक प्रतिस्थापन)। इससे उसका प्रदर्शन सामान्य रूप से संकलित विधि से अलग हो जाता है। इससे परिणाम अप्रत्याशित रूप से विकृत होते हैं।

JMH क्या उपलब्ध कराता है

  • अलग और त्याग दी जाने वाली वार्म-अप पुनरावृत्तियाँ।
  • सांख्यिकी वाली कई मापन पुनरावृत्तियाँ।
  • प्रोफ़ाइल प्रदूषण से बचने के लिए नई JVM में अलग प्रक्रियाओं में चलाना।
  • मृत-कोड उन्मूलन से बचाने के लिए Blackhole और परिणाम-उपभोग।
  • स्थिरांक फोल्डिंग को रोकने के लिए @State ऑब्जेक्ट।

इसे कैसे चलाएँ

JMH एक अलग निर्भरता (org.openjdk.jmh) है और इसे सामान्यतः एक एनोटेशन प्रोसेसर तथा Maven/Gradle build द्वारा चलाया जाता है, जो एक निष्पादन योग्य JAR तैयार करता है। आप सामान्य कोड की तरह साधारण main से बेंचमार्क नहीं चलाते।

सांख्यिकी महत्वपूर्ण है

JMH केवल औसत ही नहीं, बल्कि पुनरावृत्तियों और अलग-अलग प्रक्रियाओं के बीच त्रुटि / विश्वास अंतराल भी बताता है। 42.0 +/- 1.3 ns/op का परिणाम आपको केंद्रीय मान और उसमें हुए उतार-चढ़ाव—दोनों बताता है; किसी मापन पर भरोसा करने के लिए यह आवश्यक है।

JMH का उपयोग कब करें

दो कार्यान्वयनों के किसी अधिक उपयोग वाले पथ की तुलना करने, किसी अनुकूलन की पुष्टि करने या नैनोसेकंड से माइक्रोसेकंड स्तर के संचालन को मापने के लिए JMH का उपयोग करें। मोटे तौर पर सेकंड स्तर के कार्यों (इनपुट/आउटपुट, नेटवर्क) के लिए वास्तविक समय का मापन आमतौर पर पर्याप्त होता है।

त्वरित जाँच

JMH की आवश्यकता क्यों है, इस बारे में अपनी समझ जाँचिए।

पुनरावलोकन

आपने सीखा कि सूक्ष्म-बेंचमार्किंग के लिए हार्नेस की आवश्यकता क्यों होती है:

  • JVM वार्म-अप होता है: बहुत-से आह्वानों के बाद ही व्याख्यायित कोड संकलित होता है।
  • मृत-कोड उन्मूलन और स्थिरांक फोल्डिंग आपके कार्य को हटा या पहले से पूरा कर सकते हैं।
  • लूप अनुकूलन और ऑन-स्टैक प्रतिस्थापन हाथ से लिखे गए लूपों को विकृत करते हैं।
  • JMH वार्म-अप, मापन पुनरावृत्तियाँ, अलग प्रक्रियाओं में चलाना, Blackhole और सांख्यिकी जोड़ता है।
  • नैनोसेकंड स्तर के अधिक उपयोग वाले पथों को मापते समय इसका उपयोग करें।
शुरुआत निःशुल्क

एआई शिक्षक के साथ Java सीखें — निःशुल्क

अपने ब्राउज़र में वास्तविक कोड लिखें और चलाएँ, चौबीसों घंटे एआई शिक्षक से तुरंत सहायता पाएँ, और वेब या ऐप पर वहीं से शुरू करें जहाँ आपने छोड़ा था।

पाठ्यक्रम
104
पाठ
374

अक्सर पूछे जाने वाले प्रश्न

क्या “JMH क्यों” पाठ निःशुल्क है?

हाँ—“JMH क्यों” का पूरा पाठ यहाँ वेब पर निःशुल्क पढ़ा जा सकता है। इंटरैक्टिव अभ्यास (अंतर्निहित कोड संपादक और 24/7 एआई ट्यूटर) करने और Java Academy पाठ्यक्रम का बाकी हिस्सा अनलॉक करने के लिए CoddyKit PRO लें। Java Academy पाठ्यक्रम में कुल 4 पाठ शामिल हैं।

“JMH क्यों” में मैं क्या सीखूँगा?

भोले benchmark की गलतियों से बचें आप ब्राउज़र में सीधे चलाए जाने वाले व्यावहारिक कोड के साथ Java Academy का अभ्यास करते हैं, और पाठ पूरा करते समय 24/7 एआई ट्यूटर आपके प्रश्नों के उत्तर देता है।

क्या Java Academy शुरू करने के लिए मुझे किसी अनुभव की आवश्यकता है?

पहले के अनुभव की आवश्यकता नहीं है। CoddyKit पर Java Academy शुरुआती से लेकर उन्नत शिक्षार्थियों तक सभी के लिए व्यवस्थित किया गया है, इसलिए आप यहीं से या शुरुआत से सीखना शुरू कर सकते हैं और अपनी गति से आगे बढ़ सकते हैं। यह 4 में से 1वाँ पाठ है।

“JMH क्यों” पाठ पूरा करने में कितना समय लगता है?

CoddyKit का अधिकांश पाठ लगभग 5–10 मिनट में पूरा हो जाता है। हर पाठ छोटा और संवादात्मक है, इसलिए आप लगातार प्रगति करते हैं और वेब या ऐप पर वहीं से सीखना जारी रख सकते हैं जहाँ आपने छोड़ा था।

क्या मैं इस Java Academy पाठ में कोड लिख और चला सकता हूँ?

हाँ। हर Java Academy पाठ में एक अंतर्निर्मित कोड संपादक शामिल है, जिससे आप सीधे अपने ब्राउज़र में वास्तविक कोड लिख और चला सकते हैं और तुरंत एआई प्रतिक्रिया पा सकते हैं—स्थानीय सेटअप की आवश्यकता नहीं है।

इस पाठ्यक्रम के सभी पाठ

  1. JMH क्यों
  2. एक Benchmark लिखना
  3. Warmup और Iterations
  4. Dead-Code Elimination से बचना
← Java Academy पर वापस जाएँ