首页 > 编程语言 >C#内联函数 特性 MethodImplOptions.AggressiveInlining)

C#内联函数 特性 MethodImplOptions.AggressiveInlining)

时间:2022-12-15 23:58:50浏览次数:70  
标签:AggressiveInlining 函数 C# 函数调用 编译器 内联 inline MethodImplOptions

https://www.cnblogs.com/cdaniu/p/15900255.html

Impl:implement的缩写

内联函数

计算机科学中,内联函数(有时称作在线函数编译时期展开函数)是一种编程语言结构,用来建议编译器对一些特殊函数进行内联扩展(有时称作在线扩展);也就是说建议编译器将指定的函数体插入并取代每一处调用该函数的地方(上下文),从而节省了每次调用函数带来的额外时间开支。但在选择使用内联函数时,必须在程序占用空间和程序执行效率之间进行权衡,因为过多的比较复杂的函数进行内联扩展将带来很大的存储资源开支。另外还需要特别注意的是对递归函数的内联扩展可能引起部分编译器的无穷编译。

设计内联函数的动机

内联扩展是一种特别的用于消除调用函数时所造成的固有的时间消耗方法。一般用于能够快速执行的函数,因为在这种情况下函数调用的时间消耗显得更为突出。这种方法对于很小的函数也有空间上的益处,并且它也使得一些其他的优化成为可能。

没有了内联函式,程式员难以控制哪些函数内联哪些不内联;由编译器自行决定是否内联。加上这种控制维度准许特定于应用的知识,诸如执行函式的频繁程度,被利用于选择哪些函数要内联。

此外,在一些语言中,内联函数与编译模型联系紧密:如在C++中,有必要在每个使用它的模块中定义一个内联函数;与之相对应的,普通函数必须定义在单个模块中。这使得模块编译独立于其他的模块。

只有C++ C 才有内联函数关键字,因为C++/c注重运行效率。 C#中没有提供内联关键字,不过在在.NET4.5中开始提供了  内联函数ethodImplOptions.aggressiveinline特性, 提示/建议1CLR允许使用M值方法内联 。例如:

[MethodImpl(MethodImplOptions.AggressiveInlining)]
        public static int GetCurrentProcessorId()
        {
          ///其他代码
        }

引入内联函数的目的

函数是一种更高级的抽象。它的引入使得编程者只关心函数的功能和使用方法,而不必关心函数功能的具体实现;函数的引入可以减少程序的目标代码,实现程序代码和数据的共享。但是,函数调用也会带来降低效率的问题,因为调用函数实际上将程序执行顺序转移到函数所存放在内存中某个地址,将函数的程序内容执行完后,再返回到转去执行该函数前的地方。这种转移操作要求在转去前要保护现场并记忆执行的地址,转回后先要恢复现场,并按原来保存地址继续执行。因此,函数调用要有一定的时间和空间方面的开销,于是将影响其效率。特别是对于一些函数体代码不是很大,但又频繁地被调用的函数来讲,解决其效率问题更为重要。引入内联函数实际上就是为了解决这一问题。

使用函数内联的条件:

 虽然C#不支持inline关键字,但是JIT支持自动inline,即将IL转成真正机器码时,会自动将某些函数进行inline展开,只是条件非常苛刻,网上提到JIT自动进行inline展开的一些选择依据:

1)函数内部有循环语句、catch语句等复杂结构,都不做inline优化。
2)函数体比较长的不做inline优化,只有比较简单的才可能inline优化。(有人说IL不足32字节才做inline),
3)编译成机器码时,inline展开的代码比函数调用更短的,一定做inline。(注:如果参数多而代码少,就符合此情况)

标签:AggressiveInlining,函数,C#,函数调用,编译器,内联,inline,MethodImplOptions
From: https://www.cnblogs.com/chinasoft/p/16986270.html

相关文章

  • 【机器学习】李宏毅——卷积神经网络CNN
    CNN我们可以从两个角度来理解其中的具体过程NeuronVersionStory(解释版本1)对于图像分类,其具体的流程如下所示:将一张图像作为模型的输入,输出经过softmax之后将与理想......
  • MethodImplOptions.AggressiveInlining如果一个昂贵的参数没有被使用,它能阻止它被评估
    内联在这里没有帮助你现在的代码是voidLog(stringmessage,LogLevellogLevel){if(logLevel>=chosenLogLevel)Console.WriteLine(message);}void......
  • go 会话控制(cookie)
    session和cookie是网站浏览中较为常见的两个概念,也是比较难以辨析的两个概念,但它们在浏览需要认证的服务页面以及页面统计中却相当关键。我们先来了解一下session和cookie......
  • springMVC08(REST风格的“入门案例”)
    一、用REST风格,来演示"增、删、改、查"操作。1.1:增POST1.1.1:用PostMan测试:增POST:代码块@RequestMapping(value="/users",method=RequestMethod.POST)@R......
  • ConcurrentLinkedQueue和ConcurrentHashMap简单介绍
    ConcurrentLinkedQueue是一个单向的链表 入队列     每次在队尾追加两个节点,才移动一次tail节点添加节点1和节点2  在添加一个节点3  step4中q为......
  • docker安装minio OSS文件存储服务
    查看minio的docker版本使用docker命令查看minio的版本dockersearchminio拉取镜像dockerpullminio/minio创建目录:一个用来存放配置,一个用来存储上传文件的目录......
  • TIL:Git Squash Commits
    背景比如开发某个feature,可能需要好几天,但是每天都需要提交代码(只是假设)那commit的粒度如何控制,可以看看这个讨论:https://www.v2ex.com/t/623219可是每天提交的信息好......
  • 【Charles】使用初体验以及遇到的问题
    一、下载在官网上下载电脑适用的版本:https://www.charlesproxy.com/二、将charles设置成系统代理 三、如何设置显示request和response打开后,默认是如下图所......
  • SpringMvc的基础
     首先SpringMvc是一款实现MVC模型的轻量级web框架,主要用在写那个controller也就是控制器,也就是表现层代码的书写,以前使用Servlet来写这个表现层,现在的话使用SpringMvc就......
  • FreeSWITCH学习笔记:应用程序(APP)
    本文更新于2022-12-15,使用FreeSWITCH1.10.7。官方文档见:https://freeswitch.org/confluence/display/FREESWITCH/mod_dptools说明:下文中,部分大写为自定义变量,根据实际情......