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

 squareEnxi_571 发布于 2023-02-09 12:40

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

Basic.. 5

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

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

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

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

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

Imports System.Runtime.CompilerServices


Public Function Blah() As String 
    ...
End Function

和C#

using System.Runtime.CompilerServices;

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

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

虚拟方法

递归方法

将大值类型作为参数的方法

MarshalByRef类的方法

具有复杂流程图的方法

满足其他更奇特标准的方法

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

1 个回答
  • 是否有任何理由不将其推出单独的方法,然后使用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个字节的限制,可以增加或完全删除).我找不到足够的文件.

    2023-02-09 12:43 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有