2010-01-06 9 views
5

दृश्य मूल 2008 में, दो अलग अलग तरीकों है कि मैं के बारे में पता इसी कार्य को पूरा करने के लिएसदस्य स्तर पर मंद और प्रक्रिया स्तर पर स्थैतिक के बीच क्या अंतर है? सदस्य स्तर पर</p> <p>मंद:

Dim counter1 as integer = 0 
Dim counter2 as integer = 180 
Public Sub SampleSub1() 
    Counter1 += 1 : If (Counter1 > 14) Then Counter1 = 0 
    Counter2 += 1 : If (Counter2 > 240) Then Counter2 = 0 
End Sub 

तो फिर वहाँ है प्रक्रिया स्तर पर स्थिर:

Public Sub SampleSub2() 
    Static Dim counter1 as integer = 0 
    Static Dim counter2 as integer = 180 
    Counter1 += 1 : If (Counter1 > 14) Then Counter1 = 0 
    Counter2 += 1 : If (Counter2 > 240) Then Counter2 = 0 
End Sub 

मैं इस के माध्यम से एक पाश के बारे में 8 लाख बार चल रहा हूँ के बारे में 7 सेकंड (अधिक डेटा के साथ कार्रवाई की जा रही) में, और काउंटर पर स्थिर पद्धति का उपयोग करके वास्तव में 500ms के बारे में समय लेता है। क्या स्थिर विधि बेहतर मेमोरी प्रबंधन प्रदान करती है? यह धीमा क्यों है?

Dim SampleObject as SampleClass 
Public Sub SampleSub3() 
    SampleObject = TheQueue.Dequeue() 
End Sub 

मैं स्टेटिक विधि (जो धीमी हो रहा है का उपयोग करना चाहिए:

साथ ही, मैं अपने वस्तुओं कि कम से कम बाहर सदस्य स्तर पर एक धुंधला के साथ फिर से उपयोग किया जाता है या छोरों के लिए, की तरह घोषित) इस तरह की स्थितियों पर, या सदस्य स्तर विधि पर मंद जो मैं पहले से उपयोग कर रहा हूं?

Public Class Form1 
Dim EndLoop As Integer = 50000000 
Dim stopwatch1 As New Stopwatch 

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click 
    stopwatch1.Reset() 
    stopwatch1.Start() 

    For cnt As Integer = 1 To EndLoop 
     test1() 
    Next 
    stopwatch1.Stop() 

    Label1.Text = "Loop1: " & stopwatch1.ElapsedMilliseconds 

    stopwatch1.Reset() 
    stopwatch1.Start() 
    For cnt As Integer = 1 To EndLoop 
     test2() 
    Next 
    stopwatch1.Stop() 

    Label2.Text = "Loop2: " & stopwatch1.ElapsedMilliseconds 
End Sub 
End Class 

Public Module TestModule 
Dim counter1 As Integer = 0 
Dim counter2 As Integer = 180 
Public Sub test1() 
    counter1 += 1 : If (counter1 > 14) Then counter1 = 0 
    counter2 += 1 : If (counter2 > 240) Then counter2 = 0 
    COW1(counter1, counter2) 
End Sub 

Public Sub test2() 
    Static counter3 As Integer = 0 
    Static counter4 As Integer = 180 
    counter3 += 1 : If (counter3 > 14) Then counter3 = 0 
    counter4 += 1 : If (counter4 > 240) Then counter4 = 0 
    COW1(counter3, counter4) 
End Sub 


Public Sub COW1(ByVal counter1 As Integer, ByVal counter2 As Integer) 

End Sub 
End Module 

स्थैतिक चर के उपयोग के साथ नीचे धीमी गति से नहीं होती है जब तक कि मैं की तरह एक और मॉड्यूल से एक उप फोन कर रहा हूँ:

मैं एक परीक्षण अनुप्रयोग में इस कोड के साथ समस्या reproduced किया है उदाहरण के ऊपर।

+0

यदि आप SampleSub2 के अंदर गतिशील रूप से काउंटर 1 और काउंटर 2 घोषित करते हैं तो निष्पादन समय कैसा प्रभावित होता है? – xpda

+0

स्थिर से अभी भी तेज ... मैंने एक उदाहरण जोड़ा। – SteveGSD

उत्तर

5

स्टेटिक स्थानीय चर VB.Net की एक अजीब विशेषता है। जब आप उन्हें संकलित करते हैं, तो वे दृश्यों के पीछे एक वर्ग स्तर स्थिर चर द्वारा प्रतिनिधित्व करते हैं।

हालांकि, यदि आप एक ही समय में स्थिर स्थानीय चर शुरू कर रहे हैं और घोषित कर रहे हैं, तो वास्तव में क्या होता है यह है कि कंपाइलर इसके चारों ओर एक मॉनिटर क्लास चिपकाता है, यह सुनिश्चित करने के लिए कि इसे कई धागे द्वारा प्रारंभ नहीं किया जा सके पहर।

यह इस मॉनिटर का ओवरहेड है जिसे आप देख रहे हैं। घोषणात्मक कथन से प्रारंभिकरण को हटाने का प्रयास करें और देखें कि क्या आप प्रदर्शन सुधार देखते हैं या नहीं।

+0

मुझे वही +500 मिलीसेकंड मिलते हैं जब मैं "स्टेटिक काउंटर 1 को पूर्णांक = 0" – SteveGSD

+0

करता हूं ऐसा लगता है कि मंदी केवल तभी होती है जब इसे मॉड्यूल में उपयोग किया जा रहा हो। उदाहरण जो मैंने अभी जोड़ा है, वह सबकुछ बराबर काम करता है जब सबस फॉर्म 1 वर्ग में निहित होता है, लेकिन जब मैं सार्वजनिक मॉड्यूल में सबस डालता हूं तो केवल स्थिर विधि पर मंदी होती है। – SteveGSD

+0

स्टेटिक काउंटर 3 इंटीजर = 0 के रूप में अभी भी प्रारंभिक विवरण के साथ परिवर्तनीय घोषणा संयोजन कर रहा है। – womp

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