2010-09-30 11 views
21

मैंने हाल ही में this post about poor performance of fields marked ThreadStatic पढ़ा है - वे स्पष्ट रूप से सामान्य क्षेत्र की पहुंच से 60x धीमी हैं। क्या .NET 4 का थ्रेडलोकल < टी> कोई बेहतर प्रदर्शन करता है?थ्रेडस्टैटिक बनाम थ्रेडलोकल <T> प्रदर्शन: गति या विकल्प?

क्या कोई विकल्प है जो उच्च प्रदर्शन थ्रेड-विशिष्ट स्टोरेज प्रदान करता है?

उत्तर

30
मन में

भालू है कि 2008 में किया गया था कि - मैं जो .NET 4 ThreadStatic .NET 3.5 था की तुलना क्षेत्रों के लिए एक बहुत तेजी से होता है विश्वास है । मुझे निश्चित रूप से याद नहीं है, लेकिन यदि आप चाहें तो परीक्षण चला सकते हैं।

उसने कहा, मैं वास्तव में परीक्षण विवरण से आश्वस्त नहीं हूं - क्योंकि यह अवास्तविक है। क्या आप वास्तव में को एक लूप में थ्रेड-स्थानीय फ़ील्ड को बार-बार पढ़ने की आवश्यकता है? क्या यह अधिक संभावना नहीं है कि आप इसे एक बार पढ़ लेंगे, और फिर थोड़ी देर बाद कोड के एक अलग बिट में?

आखिरकार, असली सवाल यह है कि क्या इनमें से दोनों या दोनों दृष्टिकोण आपकी विशेष आवश्यकता के लिए पर्याप्त प्रदर्शन करते हैं या नहीं। मैं ThreadLocal<T> से ThreadStatic प्रदर्शन कारणों से नहीं, बल्कि क्योंकि यह उचित प्रारंभ करने की अनुमति देता है - उदाहरण के लिए मेरा article on randomness देखें।

+0

यादृच्छिक पर महान लेख, और उत्तर जॉन के लिए धन्यवाद। मैं थ्रेडलोकल की तुलना में बस समाप्त हो गया हूं क्योंकि यह थ्रेडस्टैटिक की तुलना में बेहतर (और उदाहरण-सुरक्षित) है। – Mark

+0

@ मार्क: बिल्कुल - यह बहुत अच्छा है :) –

20

वे कहते हैं कि [ThreadStatic]Thread.AllocateDataSlot से अधिक प्रदर्शन करने वाला है।

ThreadLocal<T> (प्रतिबिंबक के अनुसार) के कार्यान्वयन में 16 समर्पित प्रकार हैं जो कवर के तहत [ThreadStatic] का उपयोग करते हैं। एक बार उनका उपयोग किया जाता है और मुक्त नहीं होता है, TheadLocal<T>Thread.AllocateDataSlot पर स्विच करता है। (वास्तव में यह <T> प्रति 16^3 स्लॉट प्रतीत हो रहा है, वे सामान्य प्रकार के निर्माण स्लॉट्स धारण करने के लिए की एक बहुत ही अजीब योजना है)

तो मुझे लगता है कि [ThreadStatic] सबसे तेज है।

हमेशा रिसाव अबास्ट्रक्शन की जांच करना और कार्यान्वयन को देखना याद रखें! कभी भी समय-समय पर अनुकूलन को छोड़ें ;-)

+0

अच्छा अनुमान है, मैंने थ्रेडलोकल बनाम थ्रेडस्टैटिक "बेंचमार्क किया है" और ओवरहेड ~ x16 है। लेकिन जैसा कि 99.9 99 999 मामले में जॉन द्वारा देखा गया यह मामला प्रासंगिक नहीं है और आप थ्रेडस्टोकल पर थ्रेडलोकल पसंद करेंगे क्योंकि यह अधिक उपयोगकर्ता के अनुकूल है। – Pragmateek

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