साझा राज्य नीचा प्रदर्शन क्यों करता है?


19

मैं समवर्ती प्रोग्रामिंग के शेयर-नथिंग सिद्धांत के तहत काम कर रहा हूं। अनिवार्य रूप से, मेरे सभी कार्यकर्ता सूत्र के पास उसी राज्य की अपरिवर्तनीय केवल-पढ़ने योग्य प्रतियां हैं जो उनके बीच कभी भी साझा नहीं की जाती हैं ( संदर्भ द्वारा भी )। सामान्यतया, यह वास्तव में अच्छी तरह से काम किया है।

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

सवाल यह है कि ... चूंकि ताले नहीं हैं, इसलिए इस सिंगलटन की शुरूआत एक प्रदर्शन को प्रभावित करती है? वास्तव में कवर के तहत क्या चल रहा है जो इसे समझा सकता है?

पुष्टि करने के लिए, इस नए सिंगलटन तक पहुंच केवल एकमात्र परिवर्तन है और मैं इसे कॉल को कैश करने के लिए टिप्पणी करके इसे मज़बूती से पुन: बना सकता हूं।


8
क्या आपने कोड में एक प्रोफाइलर को इंगित किया है?
टिमो जूसच

2
जब तक आप CLR और संभवतः विंडोज़ कर्नेल (औसत प्रोग्रामर के लिए एक आसान काम नहीं) की रूपरेखा तैयार कर रहे हों, तब तक इस प्रश्न का उत्तर देने की संभावना नहीं है।
Igby Largeman

1
@JoeGeeky तो ठीक है, मुझे लगता है कि मेरे लिए यहाँ केवल एक चीज है +1 और एहसान करना! यह अजीब लगता है क्योंकि वे दोनों एक ही स्तर के अप्रत्यक्ष स्तर पर हैं, और प्रोसेसर कैश में वैसे भी फिट होना चाहिए, आदि ...
अधिकतम

2
एफडब्ल्यूआईटीआई मैंने कुछ धागे निकाले और कुछ टाइमर चलाए। मैंने एक क्लास, सिंगलटन, लॉकिंग सिंगलटन, और तानाशाही <string, string> को इंस्टेंट किया। प्रत्येक के पहले तात्कालिकता के बाद, किसी भी वस्तु के लिए लगातार रन ने लगभग 2000ns लिए। शब्दकोश 2x धीमा चला गया, निर्माण कोड के कारण हो सकता है ... यह अपने आप में लॉक की तुलना में धीमा है। सभी जीसी को ध्यान में रखते हुए, थ्रेड कतार की ओएस हैंडलिंग और अन्य ओवरहेड ... निश्चित रूप से कोई भी इस प्रश्न का उत्तर नहीं दे सकता है। लेकिन, मेरे परिणामों से मुझे नहीं लगता कि इस मुद्दे का सिंगलेट्स के साथ क्या संबंध है। ऐसा नहीं है अगर यह MSDN पर लागू किया जाता है। कंपाइलर ऑप्टिमाइज़ेशन को शामिल नहीं करता है।
पी। ब्रायन। मैके

1
@JoeGeeky - एक और विचार: क्या कैश का उपयोग करने से अप्रत्यक्ष स्तर बढ़ता है? यदि अक्सर एक्सेस किया जाता है, तो एक अतिरिक्त पॉइंटर डेरेफ़ (या एमएसआईएल इक्विव) का पीछा करते हुए स्थानीय कम-अप्रत्यक्ष प्रतिलिपि पर कुछ समय जोड़ सकते हैं।
sdg

जवाबों:


8

यह हो सकता है कि अपरिवर्तनीय स्थिति कैश-लाइन को कुछ परिवर्तनशील के साथ साझा करती है। इस स्थिति में, पास के परिवर्तनशील स्थिति में परिवर्तन से कोर के पार इस कैशे लाइन के पुनर्जीवन के लिए मजबूर होने का प्रभाव हो सकता है, जो प्रदर्शन को धीमा कर सकता है।


3
यह एक false sharingपरिदृश्य की तरह लगता है जो आपका वर्णन करता है। अलग करने के लिए कि मुझे L2 कैश को प्रोफाइल करना होगा। दुर्भाग्य से, ये संदर्भ प्रकार हैं इसलिए बफर स्पेस को जोड़ना एक विकल्प नहीं होगा यदि यह वास्तव में क्या हो रहा है।
जोजी डिके

3

मुझे यकीन है कि Equals()और होगाGetHashCode() वस्तुओं आप शब्दकोश के लिए कुंजी के रूप में उपयोग किसी भी अप्रत्याशित गैर सूत्रण के अनुकूल दुष्प्रभाव नहीं है के तरीके। प्रोफाइलिंग से यहां बहुत मदद मिलेगी।

यदि किसी भी संयोग से आपकी चाबी तार होती है, तो शायद आपके पास यह है: अफवाह यह है कि तार अपरिवर्तनीय वस्तुओं की तरह व्यवहार करते हैं, लेकिन कुछ अनुकूलन के लिए उन्हें आंतरिक रूप से एक म्यूटेबल तरीके से लागू किया जाता है, सब कुछ है कि यह बहुपरत के संबंध में है ।

मैं शब्दकोश को उन थ्रेड में पारित करने की कोशिश करूंगा जो एक सिंगलटन के बजाय एक नियमित संदर्भ के रूप में इसका उपयोग करते हैं, यह देखने के लिए कि समस्या साझाकरण के साथ है या शब्दकोश की एकलता के साथ है। (संभावित कारणों को खत्म करना।)

मैं भी ConcurrentDictionaryएक नियमित के बजाय Dictionaryकेवल इसके उपयोग के साथ कुछ आश्चर्यजनक परिणाम देता है। हाथ में समस्या के बारे में अनुमान लगाने के लिए बहुत सी चीजें हैं अगर ConcurrentDictionaryआपके नियमित से बहुत बेहतर या बहुत खराब प्रदर्शन करने की बारी आती हैDictionary

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

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