编辑:这不是一个关于是否可以使用GoTo语句的问题.
这是一个关于如何在不使用GoTo语句的情况下处理 .NET/IL中的O(n ^ 3)算法中心的问题.Dijkstra哲学的坚持者和同伴,请在未能阅读问题之前注意.
请考虑以下代码,其中对于大多数用例,For o = 0 to nz
循环的内容将在300万到1800万次之间执行.子例程在我的代码中取代它作为Parallel.For()调用的参数.域的m
,ny
和nz
,都在10到300之间.
它是手动优化的,以避免堆栈推送和子程序调用,换句话说,速度.我的愿望是避免编译IL,其中包括最内层循环内的操作码calli
或call
操作码.
要在测试满足后中止最里面的三个循环,我使用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
Basic.. 5
是否有任何理由不将其推出单独的方法,然后使用MethodImplOptions.AggressiveInlining("如果可能,应该内联该方法")装饰该方法.
只要该方法满足某些要求(见下文),编译器就会在调用该方法时复制该方法.
这样可以让你大量使用Return
和整理你的代码,同时跳过通常与方法调用相关的堆栈推送,跳转等.
不幸的是,由于你施加的限制,没有多少选择.
根据要求,VB.Net中的一些示例用法:
Imports System.Runtime.CompilerServicesPublic Function Blah() As String ... End Function
和C#
using System.Runtime.CompilerServices; [MethodImpl(MethodImplOptions.AggressiveInlining)] public string Blah() { ... }
我应该提一下,这是对编译器的暗示,并且存在限制.以下内容不支持内联;
虚拟方法
递归方法
将大值类型作为参数的方法
MarshalByRef类的方法
具有复杂流程图的方法
满足其他更奇特标准的方法
可能还有一个IL字节计数限制(没有此标志的情况下有32个字节的限制,可以增加或完全删除).我找不到足够的文件.
是否有任何理由不将其推出单独的方法,然后使用MethodImplOptions.AggressiveInlining("如果可能,应该内联该方法")装饰该方法.
只要该方法满足某些要求(见下文),编译器就会在调用该方法时复制该方法.
这样可以让你大量使用Return
和整理你的代码,同时跳过通常与方法调用相关的堆栈推送,跳转等.
不幸的是,由于你施加的限制,没有多少选择.
根据要求,VB.Net中的一些示例用法:
Imports System.Runtime.CompilerServices <MethodImpl(MethodImplOptions.AggressiveInlining)> Public Function Blah() As String ... End Function
和C#
using System.Runtime.CompilerServices; [MethodImpl(MethodImplOptions.AggressiveInlining)] public string Blah() { ... }
我应该提一下,这是对编译器的暗示,并且存在限制.以下内容不支持内联;
虚拟方法
递归方法
将大值类型作为参数的方法
MarshalByRef类的方法
具有复杂流程图的方法
满足其他更奇特标准的方法
可能还有一个IL字节计数限制(没有此标志的情况下有32个字节的限制,可以增加或完全删除).我找不到足够的文件.