2016-12-22 45 views
-7
Private Sub darts_Click(sender As System.Object, e As System.EventArgs) Handles darts.Click 
    For i = 0 To 20 
     MessageBox.Show(i & vbNewLine & i * 2 & vbNewLine & i * 3) 
    Next 

End Sub 

這些中的哪一個是最佳實踐/計算成本最低?

Private Sub darts2_Click(sender As System.Object, e As System.EventArgs) Handles darts2.Click 
    For i = 0 To 20 
     Dim single_score As Integer = 0 
     Dim double_score As Integer = 0 
     Dim triple_score As Integer = 0 

     single_score = i 
     double_score = i * 2 
     triple_score = i * 3 

     MessageBox.Show(single_score & vbNewLine & double_score & vbNewLine & triple_score) 
    Next 
End Sub 

顯然都獲得同樣的結果。我寫了最重要的功能,但我的朋友堅持認爲底部是正確的做法。

+3

爲什麼不運行測試來測試它們?我猜他們都編譯成相同或相似的IL,所以它們可能是等價的。 –

+2

很難想象,向用戶展示20 MsgBox的風雪可能會被視爲任何形式的最佳實踐。如果你試圖調試這些值,可以使用'Debug.Print'或者'Console.WriteLine' – Plutonix

+2

你應該可以編寫你自己的測試來確定哪個更好。如果你正在尋找更好的方法來提高性能,你可以在http://codereview.stackexchange.com/ – techturtle

回答

1

在控制檯應用程序中測試它。除去在UI線程中運行的內容,並在UI控件的事件處理程序中運行。此外,顯示消息的行爲是巨大的開銷,因此在每種方法中都將其忽略。您真正想要測試的是定義變量和分配計算值之間的性能差異,而不是使用三個較小變量來計算內聯值。

添加一個秒錶來計時兩種方法。

我還增加了一些配置,這樣你就可以決定如何多次迭代測試,以及多少次平均的運行,順利出結果。

Dim iterations = Enumerable.Range(1, 16).Select(Function(p) CInt(2^p)) 
Dim averages = 20 
Dim durations As New Dictionary(Of Integer, Dictionary(Of Integer, Double))() 
For Each iteration In iterations 
    Dim d As New Dictionary(Of Integer, Double)() 
    Dim sw As New System.Diagnostics.Stopwatch() 
    sw.Start() 
    For a = 1 To averages 
     For i = 0 To iteration - 1 
      Dim s = i & vbNewLine & i * 2 & vbNewLine & i * 3 
     Next 
    Next 
    sw.Stop() 
    d.Add(1, sw.ElapsedMilliseconds/averages) 
    sw.Restart() 
    For a = 1 To averages 
     For i = 0 To iteration - 1 
      Dim single_score As Integer = 0 
      Dim double_score As Integer = 0 
      Dim triple_score As Integer = 0 
      single_score = i 
      double_score = i * 2 
      triple_score = i * 3 
      Dim s = single_score & vbNewLine & double_score & vbNewLine & triple_score 
     Next 
    Next 
    sw.Stop() 
    d.Add(2, sw.ElapsedMilliseconds/averages) 
    durations.Add(iteration, d) 
Next 
For Each iteration In iterations 
    Console.WriteLine("Number of iterations: {0}", iteration) 
    Console.WriteLine("Method 1: {0:0.0} ms", durations(iteration)(1)) 
    Console.WriteLine("Method 2: {0:0.0} ms", durations(iteration)(2)) 
Next 
Console.ReadLine() 

他們幾乎重複的相同

數:2
方法1:0.0毫秒
方法2:0.0毫秒
反覆次數爲4
方法1: 0.0 ms
方法2:0.0 ms
迭代次數:8
方法1:0 0.0毫秒
方法2:0.0毫秒
迭代次數:16
方法1:0.0毫秒
方法2:0.0毫秒
反覆次數爲32
方法1:0.0毫秒
方法2: 0.0毫秒
反覆次數爲64
方法1:0.1毫秒
方法2:0.1毫秒
迭代次數:128
方法1:0.1毫秒
方法2:0.4毫秒
迭代次數:256
方法1:0.3毫秒
方法2:0.2毫秒
迭代次數:512
方法1:0.6毫秒
方法2:0.4毫秒
迭代次數:1024
方法1:0.7毫秒
方法2:0.7毫秒
迭代次數:2048
方法1:1.5毫秒 方法2:1.1ms
迭代次數:4096
方法1:2.2ms
方法2:2。2毫秒
迭代次數:8192
方法1:4.3毫秒
方法2:3.5毫秒
迭代次數:16384
方法1:6.7毫秒
方法2:6.7毫秒
迭代次數: 32768
方法1:13.7毫秒
方法2:13.4毫秒
迭代次數:65536
方法1:28.7毫秒
方法2:29.0毫秒