博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C#效率优化(2)-- 方法内联
阅读量:5171 次
发布时间:2019-06-13

本文共 1599 字,大约阅读时间需要 5 分钟。

  一、JIT编译器可以通过将方法内联展开(Method Inline Expansion)来提升效率,类似C++中的内联函数(Inline Function),与C++的内联函数不同的是,C#并不支持内联函数,而是由JIT编译器在运行时自动进行;

  1.对于虚方法,如果JIT编译器可以确认调用该方法时变量的运行时类型,支持方法内联;如果不可以确认变量的运行时类型,则不支持方法内联;对于调用空虚方法,与支持方法内联相比,不支持内联用时约长5倍;

※包括虚属性、虚索引器、虚事件都不支持方法内联;
※抽象方法与虚方法在方法内联方面基本一致;

  2.对于接口方法,如果使用该类型的变量调用,支持方法内联;如果使用接口类型的变量调用,则不支持方法内联;对于调用空接口方法,与使用类型的变量调用,使用接口的变量调用用时长约8倍:

public class MyBaseClass{    public virtual void MyFunc() { }}public interface IMyInterface{    void MyFunc();}public class MyClass : MyBaseClass, IMyInterface{    public override void MyFunc() { }}//使用时:MyClass myClass = new MyClass();MyBaseClass myBaseClass = new myBaseClass();IMyInterface myInterface = myClass;Stopwatch stopwatch = new Stopwatch();stopwatch.Start();for (int i = 0; i < 1000000000; i++){    myClass.MyFunc();}stopwatch.Stop();Console.WriteLine(stopwatch.ElapsedMilliseconds); //320myBaseClass = myClass; //多次赋值以使JIT编译器无法确认该变量的运行时类型stopwatch.Restart();for (int i = 0; i < 1000000000; i++){    myBaseClass.MyFunc();}Console.WriteLine(stopwatch.ElapsedMilliseconds); //1600stopwatch.Restart();for (int i = 0; i < 1000000000; i++){    myInterface.MyFunc();}Console.WriteLine(stopwatch.ElapsedMilliseconds); //2560

  二、其它不会内联的情况:

  1.递归方法;

  2.包含循环语句的方法;
  3.包含异常处理的方法;
  4.方法体的IL代码长度超过32字节的方法;
※可以通过在方法声明中加入命名空间System.Runtime.CompilerServices中的特性MethodImpl来忽略这个条件:

[MethodImpl(MethodImplOptions.AggressiveInlining)]public void MyFunc(){    //do…}

 


如果您觉得阅读本文对您有帮助,请点一下“推荐”按钮,您的认可是我写作的最大动力!

作者:

出处:

本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

转载于:https://www.cnblogs.com/minotauros/p/10341386.html

你可能感兴趣的文章
微博客实现完毕
查看>>
oracle 中 cursor 与refcursor及sys_refcursor的区别 (转载)
查看>>
python编程练习:漏洞百出的四则运算器
查看>>
js对特殊字符转义、时间格式化、获取URL参数
查看>>
我 && yii2 (一)
查看>>
2019.01.01洛谷 P4725/P4726 多项式对数/指数函数(牛顿迭代)
查看>>
2019.02.12 bzoj3944: Sum(杜教筛)
查看>>
mkdir命令
查看>>
About ListView
查看>>
java的重载 和重写
查看>>
mediaplay抓图
查看>>
层的绝对定位
查看>>
gitlab 数据同步
查看>>
又见c#
查看>>
对this的浅解
查看>>
mongodb 索引1
查看>>
eclipse环境下基于已构建struts2项目整合spring+hibernate
查看>>
[Data]Link cut tree
查看>>
二维码的生成细节和原理
查看>>
[ExtJS5学习笔记]第22 Extjs5正在使用beforeLabelTpl添加所需的配置选项标注星号标记...
查看>>