编辑:这不是关于是否可以使用GoTo语句的问题。
这是一个关于如何处理.NET/IL中O(n^3)算法的核心部分而不使用GoTo语句的问题。请注意,追随Dijkstra哲学的信徒和同行,在未阅读问题之前请注意。
考虑以下代码,对于大多数用例,For o = 0 to nz
循环的内容将被执行300万至1800万次之间。该子程序作为Parallel.For()调用的参数在我的代码中占据一席之地。 m
,ny
和nz
的范围都在10到300之间。
它经过手动优化以避免堆栈推送和子程序调用,换句话说,是为了速度。我的愿望是避免编译成包含内部循环中的calli
或call
操作码的IL。
为了在满足测试条件时中止最内层的三个循环,我使用了一个GoTo语句来中止不需要的测试。
问题是,有没有一种方法可以不使用GoTo来编写这个代码?有没有一种方式可以编写这个代码,使得.NET JIT-Compiler将编译为更快的代码,而不会在目标代码中出现call
或calli
操作码?
Sub SomeLambda(m As Integer, newarray As Short(,,))
For n = 0 To ny
For o = 0 To nz
If newarray(m, n, o) <> 1 AndAlso newarray(m, n, o) <> -1 Then
For m1 = m - 1 To m + 1
For n1 = n - 1 To n + 1
For o1 = o - 1 To o + 1
If SomeCondition = True Then 'the array is not out of bounds '
Dim testVal = newarray(m1, n1, o1)
If testVal = -1 Then
newarray(m, n, o) = -2
GoTo Exitloopslabel2
End If
End If
Next
Next
Next
Exitloopslabel2:
End If
Next
Next
End Sub