कोड की समीक्षा, मैं कई नए निजी साझा चर (प्रकार की हैशटेबल्स (स्ट्रिंग के प्रकार) में आया, घोषणा में आरंभ किया गया) एक बहुत बड़ी (डेटाकॉन्टेक्स्ट-व्युत्पन्न) कक्षा के लिए आंशिक कक्षा में जोड़ा गया। यह मेरे लिए एक समझ में समझदार लगता है क्योंकि वे कभी नहीं बदलते हैं, और इन साझा चर को सुनिश्चित करते हैं कि हर बार एक समारोह कहलाए जाने पर वे फिर से शुरू नहीं होंगे। हालांकि, इन चर केवल कक्षा में एक फ़ंक्शन के दायरे में उपयोग किए जाते हैं, और मुझे डर है कि इस डेटाकॉन्टेक्स्ट-व्युत्पन्न वर्ग के निजी नामस्थान को दूषित हो रहा है, और इस तरह के उच्च स्तर पर इस तरह की चीजें सामने आ सकती हैं भविष्य में कोड पढ़ने वाले लोगों को भ्रमित करना। क्या इन स्थानीय चरों को उस समारोह में बनाने के लिए नकारात्मक प्रदर्शन प्रभाव होगा जहां उनका उपयोग किया जाता है, या क्या इसे संभालने का कोई बेहतर तरीका है? असल में हम यह निर्धारित करने के लिए इन 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% की लागत । लेकिन ज्यादातर मामलों में (मेरे अपने सहित), समय समग्र कार्य की तुलना में संभवतः नगण्य है। तो मुझे लगता है कि सवाल अब बन गया है, लोग आम तौर पर नगण्य लेकिन ज्ञात प्रदर्शन प्रभावों पर कोड रखरखाव में सुधार के बारे में कैसा महसूस करते हैं?
मुझे नहीं लगता कि मैं यहां वास्तविक मापनीय प्रदर्शन के बारे में चिंतित हूं क्योंकि अंतर शायद ज्ञात रूप से छोटा होगा। और व्यक्तिगत मामलों को प्रोफाइल करने की आवश्यकता के बावजूद प्रदर्शन आधारित दिशानिर्देश हैं। यही वह है जो मैं यहाँ हूँ। उदाहरण के लिए, आपको आमतौर पर बॉक्सिंग और अन-मुक्केबाजी की लागत के कारण मूल्य प्रकारों से निपटने के लिए ऑब्जेक्ट संदर्भों के बजाय दृढ़ता से टाइप किए गए चर का उपयोग करना चाहिए। मेरा प्रश्न, इसी तरह के साथ, यह है कि साझा चर के बजाए स्थानीय चर का उपयोग करते समय विचार करने के लिए एक सराहनीय लागत है या नहीं। लाभ/लागत? – BlueMonkMN
असल में यह स्थिर है, लेकिन (हालांकि वीबीएनईटी स्थानीय स्थिरांक की अनुमति देता है) इस तरह के मूल्य के साथ निरंतर घोषित करना संभव नहीं है, इसलिए हमें एक चर घोषित करना होगा। और फिर हम एक समान प्रश्न में भाग लेते हैं: कक्षा के नामस्थान को प्रदूषित करने के लाभ के अतिरिक्त मूल्यों के अतिरिक्त ओवरहेड की लागत है। यह वास्तव में केवल उस विशिष्ट कार्य के लिए लागू एक स्थिर है। यह उन संपत्तियों के लिए संपत्ति नामों की एक सूची है जिनके मूल्य उस कार्य के भीतर संभाले जा रहे हैं। – BlueMonkMN
फिर मैं इसे एक स्थिर स्थानीय चर के रूप में घोषित करता हूं। ओवरहेड शायद बहुत छोटा है, इसलिए कक्षा के नामस्थान को प्रदूषित करने के लायक है, जब तक कि उस प्रकार के लाखों ऑब्जेक्ट्स बनाए जाते हैं। (1 मिलियन ऑब्जेक्ट्स = आपके स्थिर चर की 1 मिलियन प्रतियां) –