2010-01-06 34 views
5

Trong Visual Basic 2008, có hai cách khác nhau mà tôi biết để thực hiện điều tương tự:Sự khác biệt giữa độ mờ ở cấp thành viên và mức độ tĩnh ở cấp quy trình là gì?

Các Dim vào mức độ thành viên:

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 

Rồi còn có sự tĩnh vào mức độ thủ tục:

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 

Tôi đang chạy vòng lặp khoảng 8 triệu lần trong khoảng 7 giây (với nhiều dữ liệu hơn đang được xử lý) và sử dụng phương pháp tĩnh trên các quầy thực sự mất khoảng 500 mili giây. Liệu phương pháp tĩnh cung cấp quản lý bộ nhớ tốt hơn? Tại sao nó chậm hơn?

Ngoài ra, tôi tuyên bố đối tượng của tôi được tái sử dụng với một mờ vào mức độ thành viên hoặc ít nhất là bên ngoài vòng lặp for, như:

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

Tôi có nên sử dụng phương pháp tĩnh (mà có vẻ là chậm) trên các tình huống như thế này, hoặc mờ trên phương pháp cấp thành viên mà tôi đã sử dụng?

Tôi đã sao chép các vấn đề với mã này trong một ứng dụng thử nghiệm:

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 

Các chậm xuống với việc sử dụng các biến tĩnh không xảy ra trừ khi tôi đang kêu gọi một tiểu từ một mô-đun như ví dụ trên.

+0

Thời gian thực thi bị ảnh hưởng như thế nào nếu bạn khai báo Counter1 và Counter2 tự động bên trong SampleSub2? – xpda

+0

Vẫn nhanh hơn tĩnh ... Tôi đã thêm một ví dụ. – SteveGSD

Trả lời

5

Biến cục bộ tĩnh là một tính năng kỳ lạ của VB.Net. Khi bạn biên dịch chúng, chúng chỉ được đại diện bởi một biến tĩnh cấp lớp đằng sau hậu trường. Tuy nhiên, nếu bạn đang khởi tạo và khai báo một biến cục bộ tĩnh cùng một lúc, điều thực sự xảy ra là trình biên dịch sẽ dính vào một lớp Monitor xung quanh nó, để đảm bảo rằng nó không thể được khởi tạo bởi nhiều luồng tại cùng một địa chỉ, giống như vậy. thời gian.

Đó là chi phí của Màn hình này mà bạn có thể thấy. Hãy thử xóa khởi tạo từ câu lệnh khai báo và xem liệu bạn có nhận thấy cải thiện hiệu suất hay không.

+0

Tôi nhận được 50000 giây tương tự khi tôi chỉ thực hiện "Số lượt truy cập tĩnh1 dưới dạng số nguyên = 0" – SteveGSD

+0

Có vẻ như sự chậm chạp chỉ xảy ra khi nó được sử dụng trong một mô-đun. Ví dụ tôi vừa thêm vào hoạt động với tốc độ bằng nhau khi các subs được chứa trong lớp form1, nhưng một sự suy giảm chỉ trên phương thức tĩnh xảy ra khi tôi đặt các subs trong một module public. – SteveGSD

+0

Bộ đếm tĩnh3 Khi số nguyên = 0 vẫn đang kết hợp khai báo biến với câu lệnh khởi tạo. – womp

Các vấn đề liên quan