我总是假设在编写具有多个条件的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%。我可以得出结论,并行方法是通过获取所有并发比较的数据而产生瓶颈的,并且毕竟没有进行优化。那是对的吗?
答案 0 :(得分:3)
在If clause1 And clause2 And ...
中,它必须评估每个条款。您的嵌套If
不会这样做。如果您使用If clause1 AndAlso clause2 AndAlso ...
,则它可以停止在评估为False
的第一个子句进行评估。 AndAlso被称为短路运营商。