2016-12-22 3 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コントロールのイベントハンドラー内で実行されているものを削除します。また、メッセージを表示する行為はという巨大なのオーバーヘッドなので、各方法で行われているようにそのまま放置してください。実際にテストしたいのは、変数の定義と計算された値の割り当てのパフォーマンスの違いです。

ストップウォッチを追加して両方の時間を計測してください。

また、いくつかの設定を追加しました。テストする繰り返しの数と実行の平均回数を決めて結果を滑らかにすることができます。 2
方法1:0.0 MS
方法2:

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() 

それらは、反復の同じ

数かなりある0.0ミリ秒反復
数:4
方法1: 0.0 ms
方法2:0.0 ms
反復回数:8
方法1:0 0.0ミリ
方法2:0.0ミリ秒反復
数:16
方法1:0.0 MS
方法2:0.0ミリ秒反復
数:32
方法1:0.0 MS
方法2: 0.0ミリ秒反復
数:64
方法1:0.1秒
方法2:0.1ミリ秒反復
番号:128
方法1:0.1 MS
方法2:0.4ミリ秒反復
番号:256
方法1:0.3 MS
方法2:0.2ミリ秒反復
番号:512
方法1:0.6 MS
方法2:0.4 MS 反復
番号:1024
方法1:0.7 MS
方法2:0.7ミリ秒反復
番号:2048
方法1:1.5 MS
方法2:1.1 ms
反復回数:4096
方法1:2.2 ms
方法2:2。2ミリ秒 反復
数:8192
方法1:4.3 MS
方法2:3.5ミリ秒反復
番号:16384
方法1:6.7 MS
方法2:6.7ミリ秒反復
数: 32768
方法1:13.7ミリ
方法2:13.4ミリ秒の反復
番号:65536
方法1:28.7ミリ
方法2:29.0ミリ秒

関連する問題