2009-06-08 19 views
9

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

संपादित करें: मैंने अपना स्वयं का परीक्षण कार्यक्रम लिखने के लिए समय निकाला और पुष्टि की कि स्थानीय चर का उपयोग करने की लागत है (जो मुझे लगता है कि आम तौर पर सभी मामलों पर लागू होता है - मुझे संदेह है कि कोई भी मामला साझा किया गया है चर धीमी हो जाएगी जब तक साझा चर का उपयोग कर तो ठीक से करने के लिए) के लिए कुछ अतिरिक्त तर्क की आवश्यकता है:

Sub Main() 
    Dim st As New Stopwatch() 
    Dim specialCount As Integer = 0 
    Dim r As New Random() 
    Dim params As Integer() 
    ReDim params(0 To 9) 
    st.Start() 
    For i As Integer = 1 To 100000 
    For j As Integer = 0 To 9 
     params(j) = r.Next(100) 
    Next 
    If IsSpecialShare(params) Then specialCount += 1 
    Next 
    st.Stop() 

    Console.WriteLine("Shared: " & specialCount) 
    Console.WriteLine(st.Elapsed.ToString()) 

    st.Reset() 
    specialCount = 0 

    st.Start() 
    For i As Integer = 1 To 100000 
    For j As Integer = 0 To 9 
     params(j) = r.Next(100) 
    Next 
    If IsSpecialLocal(params) Then specialCount += 1 
    Next 
    st.Stop() 

    Console.WriteLine("Local: " & specialCount) 
    Console.WriteLine(st.Elapsed.ToString()) 

End Sub 

Dim specialListShared As New HashSet(Of Integer)(New Integer() {2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41}) 

Private Function IsSpecialLocal(ByVal paramList As IEnumerable(Of Integer)) As Boolean 
    Dim specialListLocal As New HashSet(Of Integer)(New Integer() {2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41}) 
    Return specialListLocal.Overlaps(paramList) 
End Function 

Private Function IsSpecialShare(ByVal paramList As IEnumerable(Of Integer)) As Boolean 
    Return specialListShared.Overlaps(paramList) 
End Function 

नमूना आउटपुट:

Shared: 75232 
00:00:00.0408223 
Local: 75018 
00:00:00.1344628 

तो इस विशेष मामले में, स्थानीय चर का उपयोग कर के बारे में 200% की लागत । लेकिन ज्यादातर मामलों में (मेरे अपने सहित), समय समग्र कार्य की तुलना में संभवतः नगण्य है। तो मुझे लगता है कि सवाल अब बन गया है, लोग आम तौर पर नगण्य लेकिन ज्ञात प्रदर्शन प्रभावों पर कोड रखरखाव में सुधार के बारे में कैसा महसूस करते हैं?

उत्तर

6

मैं कहूंगा कि आपको यह निर्धारित करने की आवश्यकता है कि क्या वे स्थिर चर वास्तव में नामस्थान, वर्ग या फ़ंक्शन से संबंधित हैं या नहीं। यदि वे वास्तव में फ़ंक्शन के लिए विशिष्ट हैं, तो मैं उन्हें फ़ंक्शन के अंदर रखूंगा।

यदि आपको चर के दायरे से बाहर होने के बाद भी राज्य को बनाए रखने वाले चर की आवश्यकता है, तो आप उन्हें Static के रूप में घोषित कर सकते हैं। यह कक्षा के दायरे में इन चरों को रखने की समस्या का उल्लंघन करता है। साझा वर्ग चर, स्टेटिक समारोह चर, और स्थानीय समारोह चर के बीच

अंतर:

साझा: वहाँ सभी वर्ग उदाहरणों के बीच चर का केवल एक प्रतिलिपि हो जाएगा।

स्टेटिक: आपकी कक्षा के प्रति उदाहरण परिवर्तनीय की एक प्रति होगी।

स्थानीय: प्रत्येक बार फ़ंक्शन कहलाए जाने पर वेरिएबल की एक प्रति बनाई जाएगी (लेकिन फ़ंक्शन एक बार कार्यक्षेत्र से बाहर हो जाता है)।

उस स्थिति का उपयोग करें जो आपकी स्थिति में समझ में आता है।

+0

मुझे नहीं लगता कि मैं यहां वास्तविक मापनीय प्रदर्शन के बारे में चिंतित हूं क्योंकि अंतर शायद ज्ञात रूप से छोटा होगा। और व्यक्तिगत मामलों को प्रोफाइल करने की आवश्यकता के बावजूद प्रदर्शन आधारित दिशानिर्देश हैं। यही वह है जो मैं यहाँ हूँ। उदाहरण के लिए, आपको आमतौर पर बॉक्सिंग और अन-मुक्केबाजी की लागत के कारण मूल्य प्रकारों से निपटने के लिए ऑब्जेक्ट संदर्भों के बजाय दृढ़ता से टाइप किए गए चर का उपयोग करना चाहिए। मेरा प्रश्न, इसी तरह के साथ, यह है कि साझा चर के बजाए स्थानीय चर का उपयोग करते समय विचार करने के लिए एक सराहनीय लागत है या नहीं। लाभ/लागत? – BlueMonkMN

+0

असल में यह स्थिर है, लेकिन (हालांकि वीबीएनईटी स्थानीय स्थिरांक की अनुमति देता है) इस तरह के मूल्य के साथ निरंतर घोषित करना संभव नहीं है, इसलिए हमें एक चर घोषित करना होगा। और फिर हम एक समान प्रश्न में भाग लेते हैं: कक्षा के नामस्थान को प्रदूषित करने के लाभ के अतिरिक्त मूल्यों के अतिरिक्त ओवरहेड की लागत है। यह वास्तव में केवल उस विशिष्ट कार्य के लिए लागू एक स्थिर है। यह उन संपत्तियों के लिए संपत्ति नामों की एक सूची है जिनके मूल्य उस कार्य के भीतर संभाले जा रहे हैं। – BlueMonkMN

+0

फिर मैं इसे एक स्थिर स्थानीय चर के रूप में घोषित करता हूं। ओवरहेड शायद बहुत छोटा है, इसलिए कक्षा के नामस्थान को प्रदूषित करने के लायक है, जब तक कि उस प्रकार के लाखों ऑब्जेक्ट्स बनाए जाते हैं। (1 मिलियन ऑब्जेक्ट्स = आपके स्थिर चर की 1 मिलियन प्रतियां) –

0

जब आप "साझा" कहते हैं - क्या यह वीबी-static के लिए बोलता है? यदि ऐसा है, तो ध्यान दें कि यदि आप सावधान नहीं हैं तो आप थोड़ी-थोड़ी थकावट में हो सकते हैं ... और विवरण दिया गया है, ऐसा लगता है कि यह डेटा उत्परिवर्तनीय हो सकता है? हो सकता है ... "दिलचस्प" यदि आपके पास कभी भी कई उदाहरण/धागे हैं।

शायद मैं बहुत ज्यादा पागल जा रहा हूँ - उदाहरण कोड के बिना बताना मुश्किल ...

उदाहरण क्षेत्रों (बजाय साझा/स्थिर क्षेत्रों) मेरा डिफ़ॉल्ट धारणा हो सकता है - फिर से लेकिन, संदर्भ के बिना मैं नहीं कर सकता 100% सुनिश्चित हो।

+0

हां, वीबी.Net साझा = सी # स्टेटिक – Pondidum

+3

या == मुझे कहना चाहिए? – Pondidum

+0

उन्हें नहीं बदला जाना चाहिए। मेरी टिप्पणी देखें "यह मेरे लिए एक समझ में समझदार लगता है क्योंकि वे कभी नहीं बदलते"। – BlueMonkMN

0

मैं लगभग भूल गया था कि वीबी.नेट स्थिर स्थानीय चर का समर्थन करता है। निम्न परीक्षण इंगित करता है कि मैं प्रदर्शन बस के रूप में एक स्थिर स्थानीय चर का उपयोग करके अच्छा प्राप्त कर सकते हैं:

Sub Main() 
    Dim st As New Stopwatch() 
    Dim specialCount As Integer = 0 
    Dim r As New Random() 
    Dim params As Integer() 
    ReDim params(0 To 9) 
    st.Start() 
    For i As Integer = 1 To 100000 
    For j As Integer = 0 To 9 
     params(j) = r.Next(100) 
    Next 
    If IsSpecialShare(params) Then specialCount += 1 
    Next 
    st.Stop() 

    Console.WriteLine("Shared: " & specialCount) 
    Console.WriteLine(st.Elapsed.ToString()) 

    st.Reset() 
    specialCount = 0 

    st.Start() 
    For i As Integer = 1 To 100000 
    For j As Integer = 0 To 9 
     params(j) = r.Next(100) 
    Next 
    If IsSpecialLocal(params) Then specialCount += 1 
    Next 
    st.Stop() 

    Console.WriteLine("Local: " & specialCount) 
    Console.WriteLine(st.Elapsed.ToString()) 

    st.Reset() 
    specialCount = 0 

    st.Start() 
    For i As Integer = 1 To 100000 
    For j As Integer = 0 To 9 
     params(j) = r.Next(100) 
    Next 
    If IsSpecialStatic(params) Then specialCount += 1 
    Next 
    st.Stop() 

    Console.WriteLine("Static: " & specialCount) 
    Console.WriteLine(st.Elapsed.ToString()) 

End Sub 

Dim specialListShared As New HashSet(Of Integer)(New Integer() {2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41}) 

Private Function IsSpecialLocal(ByVal paramList As IEnumerable(Of Integer)) As Boolean 
    Dim specialListLocal As New HashSet(Of Integer)(New Integer() {2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41}) 
    Return specialListLocal.Overlaps(paramList) 
End Function 

Private Function IsSpecialShare(ByVal paramList As IEnumerable(Of Integer)) As Boolean 
    Return specialListShared.Overlaps(paramList) 
End Function 

Private Function IsSpecialStatic(ByVal paramList As IEnumerable(Of Integer)) As Boolean 
    Static specialListLocal As New HashSet(Of Integer)(New Integer() {2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41}) 
    Return specialListLocal.Overlaps(paramList) 
End Function 

नमूना उत्पादन:

Shared: 74836 
00:00:00.0498081 
Local: 75205 
00:00:00.1317149 
Static: 74862 
00:00:00.0469154 

Btw, मैं हमेशा सी # स्थिर स्थानीय चर का समर्थन करता है, तो आश्चर्य किया है, और यदि नहीं तो बतायें, क्यों नहीं? सी # में कुछ परेशान लापता विशेषताएं हैं जो वीबीएनईटी का समर्थन करती है।

+0

यह कोई अच्छा नहीं है। गैर-साझा कार्यों के स्थिर चर प्रत्येक उदाहरण पर भंडारण आवंटित करते हैं, जो कि (हमारी स्थिति में) सभी की सबसे खराब लागत है। मुझे लगता है कि हम एक और साझा फ़ंक्शन बनाने में सक्षम हो सकते हैं जो स्थिर चर के साथ काम करता है, लेकिन वह फ़ंक्शन अभी भी "नेमस्पेस प्रदूषण" होगा। मुझे लगता है कि हमें अब के लिए साझा कक्षा क्षेत्र के साथ रहना होगा। – BlueMonkMN

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