gpt4 book ai didi

.net - 有没有办法在没有 GoTo 语句的情况下写这个?

转载 作者:行者123 更新时间:2023-12-04 14:45:44 24 4
gpt4 key购买 nike

编辑:这不是关于是否可以使用 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

和 C#
using System.Runtime.CompilerServices;

[MethodImpl(MethodImplOptions.AggressiveInlining)]
public string Blah() {
...
}

我应该提到这是对编译器的一个提示,并且存在限制。以下不支持内联;
  • 虚拟方法
  • 递归方法
  • 将大值类型作为参数的方法
  • MarshalByRef 类上的方法
  • 具有复杂流程图的方法
  • 满足其他更奇特标准的方法

  • 也可能有一个 IL 字节数限制(没有这个标志有 32 个字节的限制,可以增加或完全删除)。我一直无法找到足够的文档。

    关于.net - 有没有办法在没有 GoTo 语句的情况下写这个?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20671507/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com