有没有办法在没有GoTo语句的情况下编写它?

Rob*_*ins 6 .net vb.net performance il goto

编辑:这不是一个关于是否可以使用GoTo语句的问题.

这是一个关于如何在使用GoTo语句的情况下处理 .NET/IL中的O(n ^ 3)算法中心的问题.Dijkstra哲学的坚持者和同伴,请在未能阅读问题之前注意.

请考虑以下代码,其中对于大多数用例,For o = 0 to nz循环的内容将在300万到1800万次之间执行.子例程在我的代码中取代它作为Parallel.For()调用的参数.域的m,nynz,都在10到300之间.

它是手动优化的,以避免堆栈推送和子程序调用,换句话说,速度.我的愿望是避免编译IL,其中包括最内层循环内的操作码callicall操作码.

要在测试满足后中止最里面的三个循环,我使用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
Run Code Online (Sandbox Code Playgroud)

Bas*_*sic 5

是否有任何理由不将其推出单独的方法,然后使用MethodImplOptions.AggressiveInlining("如果可能,应该内联该方法")装饰该方法.

只要该方法满足某些要求(见下文),编译器就会在调用该方法时复制该方法.

这样可以让你大量使用Return和整理你的代码,同时跳过通常与方法调用相关的堆栈推送,跳转等.

不幸的是,由于你施加的限制,没有多少选择.

根据要求,VB.Net中的一些示例用法:

Imports System.Runtime.CompilerServices

<MethodImpl(MethodImplOptions.AggressiveInlining)>
Public Function Blah() As String 
    ...
End Function
Run Code Online (Sandbox Code Playgroud)

和C#

using System.Runtime.CompilerServices;

[MethodImpl(MethodImplOptions.AggressiveInlining)] 
public string Blah() {
    ...
}
Run Code Online (Sandbox Code Playgroud)

我应该提一下,这是对编译器的暗示,并且存在限制.以下内容不支持内联;

  • 虚拟方法
  • 递归方法
  • 将大值类型作为参数的方法
  • MarshalByRef类的方法
  • 具有复杂流程图的方法
  • 满足其他更奇特标准的方法

可能还有一个IL字节计数限制(没有此标志的情况下有32个字节的限制,可以增加或完全删除).我找不到足够的文件.