2009-06-10 14 views
11

मैं पिछले कुछ मिनटों से खुद से यह बहस कर रहा हूं, और मैं हां और नहीं दोनों के कारण देख रहा हूं। यह Java HashMap vs. Hashtable के उत्तरों को देखने से रोकता है और कई लोगों को यह कहते हुए कहते हैं कि हैशटेबल वास्तव में धीमी है।एकल थ्रेडेड अनुप्रयोगों में सिंक्रनाइज़ किए गए तरीके धीमे हैं?

ऐसा लगता है कि एक सिंक्रनाइज़ विधि एक एकल धागे में चलने पर अपने असंक्रनाइज़ समकक्ष से बिल्कुल अलग नहीं है, क्योंकि सिंक्रनाइज़ेशन की कार्रवाई को कुछ भी अवरुद्ध नहीं करना चाहिए। उस ने कहा, मुझे लगता है कि संकलक दो मामलों को अलग-अलग संभालता है और यही कारण है कि लोग सिंक्रनाइज़ कह रहे हैं धीमे हैं।

यह नहीं कि यह किसी भी तरह से निर्णायक है, लेकिन मैंने हैश मैप बनाम हैशटेबल पर कुछ सरल परीक्षण चलाए, और गति में थोड़ा अंतर देखा।

+1

बाधा आपके एल्गोरिदम में होगी। इसलिए, सिंक्रनाइज़ेशन ओवरहेड मामूली होना चाहिए। – sybreon

उत्तर

15

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

नोट जावा 6 है और जावा 7 लॉकिंग के आसपास अच्छा अनुकूलन है कि: ताला लगा

  • लॉक coarsening
  • लॉक इलिजन
  • अनुकूली स्पिन ताला लगा
  • पक्षपातपूर्ण

अधिक जानकारी के लिए, Java SE 6 Performance White Paper देखें। यह भी ध्यान रखें कि एकल-सीपीयू सीपीयू की तुलना में असंगत सिंक्रनाइज़ेशन बहु-कोर CPUs पर अधिक महंगा प्रतीत होता है, शायद स्थानीय CPU कैश को अन्य CPUs, या कुछ अन्य मेमोरी बाधाओं के साथ साझा करने के लिए सिंक्रनाइज़ेशन की जावा मेमोरी मॉडल आवश्यकताओं के कारण। उदाहरण के लिए, Do Java 6 threading optimizations actually work? - Part II पढ़ें। (भाग मैं भाग II के रूप में अंतर्दृष्टि के रूप में नहीं था।)

+0

+1 - सिंक्रनाइज़ेशन स्वयं सस्ता है। – serg10

+0

@ serg10: Contention? एक थ्रेडेड प्रोग्राम में? नहीं। –

5

हां। ताले बनाए रखने के अतिरिक्त ओवरहेड के कारण वे थोड़ा धीमे होने जा रहे हैं।

+3

बस इतना ही थोड़ा। +1 – sybreon

+0

... यदि जेआईटी यह तय नहीं कर सकता कि उसे इस मामले में ताले बनाए रखने की आवश्यकता नहीं है ... –

0

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

ध्यान दें कि लिनक्स के फ्यूटेक्स जैसे चीजों को विवाद होने तक सिस्टम कॉल करने की आवश्यकता नहीं है, लेकिन उनका उपयोग करना अभी भी नो-ऑप से धीमा है।

+0

सिवाय इसके कि ओएस सीपीयू गर्म swappable मुझे लगता है; तो JVM उस धारणा को करने में सक्षम नहीं होगा? –

+0

समस्या इतनी अधिक नहीं है कि कई CPUs हैं जैसे JVM के अंदर कई धागे हैं। सच है, इस बात से अवगत होना कि क्या कई सीपीयू इस अनुकूलन की प्रयोज्यता को विस्तृत करेंगे, लेकिन एकाधिक CPUs होने पर एकल थ्रेडेड ऐप चलाने के लिए यह कहीं अधिक आम है। जिस बिंदु पर मैं पार करने की कोशिश कर रहा था वह यह था कि मुझे शून्य-लागत अपवादों के लिए किसी भी म्यूटेक्स एनालॉग की जानकारी नहीं है। – user57368

+0

यदि आपका कोड केवल * चीज़ * कर रहा था, तो ताले हासिल करना और रिलीज़ करना, हाँ यह धीमा हो जाएगा। जब तक ताले पर्याप्त नहीं होते हैं, तब तक आपके कोड में कोई भी मंदी कम होगी, खासकर हाल ही में किसी भी जेवीएम। अनचाहे लॉकिंग अब महंगा नहीं है। विवाद का उल्लेख करने के लिए – Eddie

संबंधित मुद्दे