कम विलंबता जावा लेखन [बंद]


30

क्या जावा में कम विलंबता कोड लिखने के लिए कोई जावा-विशिष्ट तकनीक (चीजें जो C ++ पर लागू होती हैं) हैं? मुझे अक्सर जावा कम विलंबता भूमिकाएं दिखाई देती हैं और वे कम विलंबता जावा लिखने के अनुभव के लिए पूछते हैं- जो कभी-कभी एक ऑक्सीमोरोन का थोड़ा सा लगता है।

केवल यही सोचता हूं कि मैं जेएनआई के साथ अनुभव कर सकता हूं, मूल कोड में आई / ओ कॉल को आउटसोर्सिंग करता हूं। इसके अलावा संभवतः विघटनकारी पैटर्न का उपयोग करते हुए, लेकिन यह एक वास्तविक तकनीक नहीं है।

क्या कम विलंबता कोड लिखने के लिए कोई जावा विशिष्ट युक्तियाँ हैं?

मुझे पता है कि एक वास्तविक समय जावा कल्पना है, लेकिन मुझे चेतावनी दी गई है कि वास्तविक समय कम विलंबता के समान नहीं है ...।


बहुत सी वस्तुओं का निर्माण न करें जो एक संग्रह चक्र को ट्रिगर कर सकते हैं मेरा अनुमान है
शाफ़्ट फ्रीक

@ratchet, मुझे लगता है कि कुछ भी संजाल या डिस्क संबंधित होगा JNI भी होगा?
user997112

आगे लिंक और प्रस्तुतियों के लिए, आप प्रदर्शन जावा उपयोगकर्ता की समूह में रुचि हो सकती plus.google.com/u/1/communities/107178245817384004088
पीटर Lawrey

मैं sun.misc.Unsafe का उपयोग करके जोड़ूंगा, प्रत्यक्ष या अप्रत्यक्ष रूप से उपयोगी है। कई असुरक्षित तरीकों को आंतरिक माना जाता है जिसका अर्थ है कि उन्हें मशीन कोड से बदल दिया जाता है, जो किसी भी जेएनआई से बचा जाता है।
पीटर लॉरी

प्रमुख तकनीक किसी भी जीसी ओवरहेड से पूरी तरह से बचने के लिए है। आप इस लेख में इस बारे में और अधिक पढ़ सकते जावा डेवलपमेंट जीसी बिना
rdalmeida

जवाबों:


35

मार्टिज़न की टिप्पणियों के अलावा मैं इसमें शामिल होऊंगा :

  1. अपने जेवीएम को गर्म करें। बाइटकोड को हॉटस्पॉट के लिए व्याख्यायित किया जाना शुरू होता है और फिर 10K टिप्पणियों के बाद सर्वर पर संकलित हो जाता है । Tiered Compilation एक अच्छा स्टॉप गैप हो सकता है।

  2. क्लास लोडिंग एक अनुक्रमिक प्रक्रिया है जिसमें IO से डिस्क शामिल है। सुनिश्चित करें कि आपके मुख्य लेन-देन प्रवाह के लिए सभी वर्ग अग्रिम लोड किए गए हैं और वे कभी भी परमिट पीढ़ी से बाहर नहीं निकलते हैं।

  3. विवाद से बचने के लिए "लिटिल राइटर प्रिंसिपल " का पालन ​​करें और लिटिल लॉ के कतई प्रभाव प्रभाव से बचने के लिए, प्लस जो समानांतर हो सकता है उसके लिए अमदल के कानून का अध्ययन करें और इसके लायक है।

  4. मॉडल आप व्यापार डोमेन और यह सुनिश्चित करें कि आपके सभी एल्गोरिदम ओ (1) या कम से कम ओ (लॉग एन) हैं। यह शायद मेरे अनुभव में प्रदर्शन के मुद्दों का सबसे बड़ा कारण है। सुनिश्चित करें कि आपके पास मुख्य मामलों को कवर करने के लिए प्रदर्शन परीक्षण हैं।

  5. जावा में कम विलंबता सिर्फ जावा तक सीमित नहीं है। आपको उस पूरे स्टैक को समझने की आवश्यकता है जिस पर आपका कोड निष्पादित हो रहा है। इसमें OS ट्यूनिंग, हार्डवेयर के लिए उपयुक्त हार्डवेयर, ट्यूनिंग सिस्टम सॉफ्टवेयर और डिवाइस ड्राइवर का चयन करना शामिल होगा।

  6. वास्तविक बनो। यदि आपको निम्न-विलंबता की आवश्यकता है, तो एक हाइपरवाइज़र पर न चलें। सुनिश्चित करें कि आपके पास सभी थ्रेड्स के लिए पर्याप्त कोर हैं जो कि रनने योग्य स्थिति में होना चाहिए।

  7. कैश मिस आपके प्रदर्शन की सबसे बड़ी लागत है। ऐसे एल्गोरिदम का उपयोग करें जो कैश फ्रेंडली हों और प्रोसेसर कोर के लिए आत्मीयता निर्धारित करें या व्यक्तिगत धागों के लिए जेवीएम या जेएनआई के लिए कार्य करें।

  8. अज़ुल से ज़िंग जैसे वैकल्पिक जेवीएम पर विचार करें, जिसमें कम-कम कचरा कलेक्टर है।

  9. सबसे महत्वपूर्ण बात यह है कि किसी को अनुभव के साथ शामिल करें। यह आपको लंबे समय में इतना समय बचाएगा। बेशर्म प्लग :-)

वास्तविक समय और कम विलंबता अलग-अलग विषय हैं, हालांकि अक्सर संबंधित हैं। वास्तविक समय तेजी से अधिक अनुमानित होने के बारे में है। मेरे अनुभव में, वास्तविक JVMs, यहां तक ​​कि नरम वास्तविक समय वाले, सामान्य JVM की तुलना में धीमे हैं।


2
एक महान जवाब के लिए +1। जैसे कि tx प्रोसेसिंग पोस्ट में रुचि रखने वाले व्यक्ति अनुसंधान के लिए एक शानदार शुरुआत हैं।
mcfinnigan

23

हाँ के बारे में पता करने के लिए चीजों का एक गुच्छा है। मैं इस समय सीमित शुद्ध पहुंच के साथ क्रेते में हूं इसलिए यह (काफी) छोटा होगा। इसके अलावा, मैं कम-विलंबता विशेषज्ञ नहीं हूं, लेकिन मेरे कई साथी वास्तविक जीवन में एक भूमिका निभाते हैं :-)।

  1. आपको मैकेनिकल सिम्पैथी ( मार्टिन थॉम्पसन द्वारा गढ़ा गया एक शब्द ) की सराहना करने की आवश्यकता है । दूसरे शब्दों में आपको यह समझने की आवश्यकता है कि आपका अंतर्निहित हार्डवेयर क्या कर रहा है। यह जानते हुए कि सीपीयू कैश लाइनों को कैसे लोड करते हैं, उनकी रीड / राइट बैंडविड्थ क्या है, मुख्य मेमोरी की गति और बहुत कुछ, बहुत अधिक महत्वपूर्ण है। क्यूं कर? क्योंकि आपको इस बात की आवश्यकता होगी कि आपका जावा स्रोत कोड रनटाइम JVM के माध्यम से ऑपरेटिंग सिस्टम / हार्डवेयर को कैसे प्रभावित करता है। उदाहरण के लिए, जिस तरह से आपके फ़ील्ड चर आपके स्रोत कोड में कैशे लाइन बेदखली (लागत आप ~ 150 घड़ी चक्र), हम्म ... :-) पैदा कर रहे हैं।

  2. आम तौर पर आप लॉक फ्री एल्गोरिदम और आई / ओ चाहते हैं। यहां तक ​​कि सबसे अच्छी तरह से डिज़ाइन किया गया समवर्ती अनुप्रयोग (जिसमें ताले का उपयोग होता है) अवरुद्ध होने का खतरा है, कम विलंबता में अवरुद्ध करना आमतौर पर खराब है :-)।

  3. ऑब्जेक्ट एलोकेशन और गारबेज कलेक्शन को समझें। यह एक व्यापक विषय है, लेकिन मूल रूप से आप जीसी ठहराव से बचना चाहते हैं (अक्सर स्टॉप द वर्ल्ड नेचर ऑफ विभिन्न जीसी संग्रह)। अज़ुल कलेक्टर जैसे विशेषज्ञ जीसी कलेक्टर कई मामलों में आपके लिए इस समस्या का समाधान कर सकते हैं, लेकिन अधिकांश लोगों के लिए उन्हें यह समझने की आवश्यकता है कि सूर्य / ओरेकल जीसी (सीएमएस, जी 1, आदि) को कैसे ट्यून किया जाए।

  4. हॉटस्पॉट जेआईटी आश्चर्यजनक है। इसके अनुकूलन के बारे में जानें, लेकिन आम तौर पर सभी अच्छी ओओ तकनीक (इनकैप्सुलेशन, छोटे तरीके, जितना संभव हो उतना अपरिवर्तनीय डेटा) बोलते हुए, जेआईटी को ऑप्टिमाइज़ करने की अनुमति देगा, जिससे आपको प्रदर्शन स्तर के प्रकार मिलते हैं जो आपके द्वारा C / C ++ कोड को अच्छी तरह से तैयार करते हैं।

  5. कुल मिलाकर सिस्टम आर्किटेक्चर। नेटवर्क से अवगत रहें, कि कैसे मशीन सह-स्थित हैं, अगर आप फाइबर आदि के माध्यम से एक्सचेंज से जुड़े हैं।

  6. लॉगिंग के प्रभाव के बारे में पता होना। द्विआधारी लॉगिंग या कोडित आउटपुट का उपयोग करना जिसे आप लाइन से पार्स कर सकते हैं शायद एक अच्छा विचार है।

कुल मिलाकर, मैं किर्क पेप्परडाइन के जावा प्रदर्शन ट्यूनिंग पाठ्यक्रम पर जाने की अत्यधिक सलाह देता हूं [अस्वीकरण: मैं खुद इस पाठ्यक्रम को सिखाता हूं, इसलिए मैं पक्षपाती हूं]। आपको जेवीएम के विभिन्न पहलुओं और अंतर्निहित ओ / एस और हार्डवेयर पर इसके प्रभाव का अच्छा कवरेज मिलेगा।

पुनश्च: मैं इसे बाद में फिर से प्रकाशित करने और कुछ को साफ करने की कोशिश करूँगा।


यह वास्तव में अच्छा होगा यदि मैकेनिकल सिम्पैथी के साथ अनुभवी लोग किसी दिए गए सीमा को पार करने के दौरान पता लगाने के लिए कुछ तरकीबें साझा कर सकते हैं।

मैंने कोशिश की है कि ट्विटर को :-) और वास्तविक विशेषज्ञों में प्राप्त करने के लिए :-)
Martijn Verburg

शांत, मार्टिन थॉम्पसन ने खदान में अपनी सलाह का पालन करने के लायक है।
मार्टिज़न वेरबर्ग
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.