- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
编辑:这不是关于是否可以使用 GoTo 语句的问题。
这是一个关于如何在不使用 GoTo 语句的情况下处理 .NET/IL 中 O(n^3) 算法的中心的问题。 Dijkstra 哲学的追随者和同行者,请在未阅读问题之前注意。
考虑以下代码,其中对于大多数用例 For o = 0 to nz
的内容循环将执行 300 万到 1800 万次。该子例程在我的代码中作为 Parallel.For() 调用的参数出现。 m
的域名, ny
, 和 nz
都在 10 到 300 之间。
它是手动优化的,以避免堆栈推送和子程序调用,换句话说,是为了速度。我的愿望是避免编译到包含 calli
的 IL或 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
最佳答案
有什么理由不把它推出一个单独的方法,然后用 MethodImplOptions.AggressiveInlining 装饰该方法吗? (“如果可能,应内联该方法”)。
只要该方法满足某些要求(见下文),编译器就会在调用该方法的地方制作该方法的副本。
这会让你使用 Return
并大幅整理您的代码,同时还跳过通常与方法调用相关的堆栈推送、跳转等。
不幸的是,由于您强加的限制,没有太多选择。
根据要求,VB.Net 中的一些示例用法:
Imports System.Runtime.CompilerServices
<MethodImpl(MethodImplOptions.AggressiveInlining)>
Public Function Blah() As String
...
End Function
using System.Runtime.CompilerServices;
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public string Blah() {
...
}
关于.net - 有没有办法在没有 GoTo 语句的情况下写这个?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20671507/
我是一名优秀的程序员,十分优秀!