午後わてんのブログ

ベランダ菜園とWindows用アプリ作成(WPFとC#)

条件分岐最適化、処理時間の計測 Visual Basic編

エクセルVBAに続いて

Visual Basicでも試してみた

CPUはPhenomⅡX3 720B
結果

f:id:gogowaten:20191018134719p:plain

いまどきの条件分岐のほうが早い結果が出た!
エクセルVBAとは違う結果になった
Select Caseでもいまどきの方が早い!
 
 
エクセルVBAの結果は↓の記事

gogowaten.hatenablog.com

条件分岐最適化、処理時間の計測 ( ソフトウェア ) - 午後わてんのブログ - Yahoo!ブログ

 
 
xが0、1、2、3のどれかのとき
3のとき
2のとき
0か1のとき
で条件分岐させるときに

        If x = 3 Then
        ElseIf x = 2 Then
        Else
        End If
↑これ(いまどき)が早いのか

↓今までどおり(昔ながら)のこれが早いのか
        If x < 2 Then
        ElseIf x = 2 Then
        Else
        End If

これでうえのほうが早いって実際に結果が出たわけだけど違和感あるなあ
 
 
イメージ 4
Button1を押すと計測開始で結果が表示される、ソレダケ!
2019/10/18追記

f:id:gogowaten:20191018135834p:plain

新しいパソコンで計測してみた
CPUはRYZEN 2400G
OSはWindows 10
Visual Studioは2019Community
追記ここまで
 
 
VBはエクセルVBAに比べると時間計測がラクチン
その名もストップウォッチクラスってのがあるからそれを使えば簡単だった
 
ダウンロード
参照したところ
VB.NET - 乱数 (ランダムな数) を取得する
 
 
 
デザイン画面

f:id:gogowaten:20191018134737p:plain

ボタンを一個追加しただけ
 
コード

f:id:gogowaten:20191018134754p:plain

Public Class Form1

    Function GetRandArray(myAry() As Integer)
        Dim i As Integer
        Dim Cnt As Long = UBound(myAry)
        Dim myR As New Random
        'Randomize()
        For i = 0 To Cnt
            'myAry(i) = CInt((Rnd() * 3))
            myAry(i) = myR.Next(4)
        Next
        Return myAry
    End Function
    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        Const Cnt As Long = 1000000 '条件分岐回数指定
        Dim intAry(Cnt) As Integer
        intAry = GetRandArray(intAry)
        Dim OldIfTime, NewIfTime, OldSTime, NewSTime As TimeSpan
        Dim sw As New Stopwatch
        Dim I10, I2, I3 As Long

        sw.Start() 'ストップウォッチ開始
        For i = 0 To Cnt
            If intAry(i) < 2 Then
                I10 += 1
            ElseIf intAry(i) = 2 Then
                I2 += 1
            Else
                I3 += 1
            End If
        Next
        OldIfTime = sw.Elapsed 'ストップウォッチ計測


        I10 = 0 : I2 = 0 : I3 = 0 'カウントリセット
        sw.Restart() 'ストップウォッチ再計測開始
        For i = 0 To Cnt
            If intAry(i) = 3 Then
                I3 += 1
            ElseIf intAry(i) = 2 Then
                I2 += 1
            Else
                I10 += 1
            End If
        Next
        NewIfTime = sw.Elapsed

        I10 = 0 : I2 = 0 : I3 = 0
        sw.Restart()
        For i = 0 To Cnt
            Select Case True
                Case intAry(i) < 2
                    I10 += 1
                Case intAry(i) = 2
                    I2 += 1
                Case Else
                    I3 += 1
            End Select
        Next
        OldSTime = sw.Elapsed

        I10 = 0 : I2 = 0 : I3 = 0
        sw.Restart()
        For i = 0 To Cnt
            Select Case True
                Case intAry(i) = 3
                    I3 += 1
                Case intAry(i) = 2
                    I2 += 1
                Case Else
                    I10 += 1
            End Select
        Next
        NewSTime = sw.Elapsed

        '結果表示
        MsgBox(OldIfTime.ToString & "(OldIF)" & vbNewLine & _
               NewIfTime.ToString & "(NewIF)" & vbNewLine & _
               OldSTime.ToString & "(OldSelect)" & vbNewLine & _
               NewSTime.ToString & "(NewSelect)" & vbNewLine & vbNewLine & _
               I10 & "(0or1の個数)" & vbNewLine & _
               I2 & "(2の個数)" & vbNewLine & _
               I3 & "(3の個数)")

    End Sub
End Class