并行和嵌套IF条件之间的性能差异

时间:2014-03-22 11:46:17

标签: vb.net

我总是假设在编写具有多个条件的if语句时,并行方式是优越的,因为编译器可以将并行语句优化为SIMD指令。今天我出于好奇而测试了它并得到了相反的结果。下面是测试代码:

    Dim iterations As Integer = 100000000
    Dim result1 As New List(Of Boolean)
    Dim result2 As New List(Of Boolean)

    Dim r As New Random
    Dim rvalues As New List(Of Integer)
    For i = 0 To iterations + 8
        rvalues.Add(r.Next(Integer.MinValue, Integer.MaxValue))
    Next

    Dim t1 As Integer = Environment.TickCount

    For i = 0 To iterations
        If rvalues(i) < rvalues(i + 1) Then
            If rvalues(i + 2) < rvalues(i + 3) Then
                If rvalues(i + 4) < rvalues(i + 5) Then
                    If rvalues(i + 6) < rvalues(i + 7) Then
                        result1.Add(True)
                    Else
                        result1.Add(False)
                    End If
                Else
                    result1.Add(False)
                End If
            Else
                result1.Add(False)
            End If
        Else
            result1.Add(False)
        End If
    Next

    t1 = Environment.TickCount - t1

    Dim t2 As Integer = Environment.TickCount

    For i = 0 To iterations
        If rvalues(i) < rvalues(i + 1) And rvalues(i + 2) < rvalues(i + 3) And rvalues(i + 4) < rvalues(i + 5) And rvalues(i + 6) < rvalues(i + 7) Then
            result2.Add(True)
        Else
            result2.Add(False)
        End If
    Next

    t2 = Environment.TickCount - t2

    Dim checkOK As Boolean = True
    For i = 0 To iterations
        If result1(i) <> result2(i) Then checkOK = False
    Next

    MsgBox("nested: " & t1 & " parallel: " & t2 & " checkOK: " & checkOK)

我得到的结果是嵌套方法一直快〜25%。我可以得出结论,并行方法是通过获取所有并发比较的数据而产生瓶颈的,并且毕竟没有进行优化。那是对的吗?

1 个答案:

答案 0 :(得分:3)

If clause1 And clause2 And ...中,它必须评估每个条款。您的嵌套If不会这样做。如果您使用If clause1 AndAlso clause2 AndAlso ...,则它可以停止在评估为False的第一个子句进行评估。 AndAlso被称为短路运营商。