哪一个是最佳实践/计算量最小?

时间:2016-12-22 15:36:37

标签: vb.net comparison

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

两者都明显达到了相同的效果。我写了顶级函数,但我的朋友坚持认为底部是正确的方法。

1 个答案:

答案 0 :(得分: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毫秒   
方法2:0.0毫秒   
迭代次数:8   
方法1: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.1毫秒   
迭代次数:4096   
方法1:2.2毫秒   
方法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毫秒