C#效率优化(2)-- 方法内联

时间:2022-05-04 12:25:46

  一、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 = ; i < ; i++)
{
myClass.MyFunc();
}
stopwatch.Stop();
Console.WriteLine(stopwatch.ElapsedMilliseconds); //
myBaseClass = myClass; //多次赋值以使JIT编译器无法确认该变量的运行时类型
stopwatch.Restart();
for (int i = ; i < ; i++)
{
myBaseClass.MyFunc();
}
Console.WriteLine(stopwatch.ElapsedMilliseconds); //
stopwatch.Restart();
for (int i = ; i < ; i++)
{
myInterface.MyFunc();
}
Console.WriteLine(stopwatch.ElapsedMilliseconds); //

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

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

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

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

作者:Minotauros
出处:https://www.cnblogs.com/minotauros/

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

C#效率优化(2)-- 方法内联的更多相关文章

  1. jvm之方法内联优化

    前言 在日常中工作中,我们时不时会代码进行一些优化,比如用新的算法,简化计算逻辑,减少计算量等.对于java程序来说,除了开发者本身对代码优化之外,还有一个"人"也在背后默默的优化 ...

  2. JVM 学习(二)Java 内存模型、方法内联、逃逸 --- 2019年4月

    1.Java 的内存模型 定义了 happens-before,如果同一个线程中,字节码的先后顺序,后者观测了前者的运行结果,那么就会按顺序执行. Java 线程之间的通信由 Java 内存模型控制. ...

  3. 深入理解java虚拟机(十四)正确利用 JVM 的方法内联

    在IntelliJ IDEA里面Ctrl+Alt+M用来拆分方法.选中一段代码,敲下这个组合,非常简单.Eclipse也用类似的快捷键,使用 Alt+Shift+M.我讨厌长的方法,提起这个下面这个方 ...

  4. Java 方法内联

    什么是Java 方法内联? 我们先来看看普遍的内联函数含义.在*中解释为: 内联函数:在计算机科学中,内联函数(有时称作在线函数或编译时期展开函数)是一种编程语言结构,用来建议编译器对一些特殊函 ...

  5. Java中的方法内联

    Java中的方法内联 1. 什么是方法内联 例如有下面的原始代码: static class B { int value; final int get() { return value; } } pu ...

  6. Java方法内联

    一.概念 方法内联就是把调用方函数代码"复制"到调用方函数中,减少因函数调用开销的技术   函数调用过程 1.首先会有个执行栈,存储它们的局部变量.方法名.动态连接 2.当一个方法 ...

  7. 修改html内联样式的方法

    问题:如下图弹出页面操作不了 分析:审查元素,发现是内联元素样式z-index:19891015导致的,修改内联元素样式z-index:0发现可以操作了 解决方法:内联样式优先级高,再引入css覆盖样 ...

  8. 晚期(运行期)优化---HotSpot虚拟机内的即时编译器

    最初java程序是通过解释器进行解释执行的,当虚拟机发现某个方法或代码块的运行特别频繁时,就会把这些代码认定为“热点代码”.为了提高热点代码的执行效率,在运行时,虚拟机将会把这些代码编译成与本地平台相 ...

  9. &lowbar;&lowbar;inline定义的内联函数和宏的区别

    转自:http://blog.csdn.net/lw370481/article/details/7311668 函数与宏 #define TABLE_COMP(x) ((x)>0?(x):0) ...

随机推荐

  1. loj 1429&lpar;可相交的最小路径覆盖&rpar;

    题目链接:http://lightoj.com/volume_showproblem.php?problem=1429 思路:这道题还是比较麻烦的,对于求有向图的可相交的最小路径覆盖,首先要解决成环问 ...

  2. jsp页面编译成Servlet类文件

    package org.apache.jsp; import javax.servlet.*; import javax.servlet.http.*; import javax.servlet.js ...

  3. oracle——session

    一.解释session web应用中,session是服务器段保存用户信息的一个对象,cookie是浏览器端保存用户信息的对象.今天了解了oracle也有session对象,那么什么是oracle的s ...

  4. PHP常用代码大全

    1.连接MYSQL数据库代码 <?php $connec=mysql_connect("localhost","root","root&quot ...

  5. 算法导论(第三版) Exercises4&period;2(求最大和子数组的算法优化过程)

    4.1-1 如所有元素都为负,则返回所有元素中最大的负数. 4.1-2(暴力法求最大和子数组) struct subarray { int start, end, sum; }; void brute ...

  6. 安卓Tv开发(二)移动智能电视之焦点控制(按键事件)

    原文:http://blog.csdn.net/sk719887916/article/details/44781475 skay 前言:移动智能设备的发展,推动了安卓另一个领域,包括智能电视和智能家 ...

  7. Java遍历Map对象的四种方式

    关于java中遍历map具体哪四种方式,请看下文详解吧. 方式一 :这是最常见的并且在大多数情况下也是最可取的遍历方式.在键值都需要时使用. Map<Integer, Integer> m ...

  8. FreeRTOS不允许在中断服务程序和临界段中执行不确定的性的操作

    举例 等待事件标志组的任务,要是在中断服务程序中设置事件标志组,但不知道当前有多少个任务在等待此事件标志,这个操作即为不确定性操作,为了不在中断服务程序中执行此不确定性操作,只在中断服务程序中给一确定 ...

  9. hive学习-测试数据

    测试数据: ---------------------------------------------MySQL-------------------------------------------- ...

  10. js实现软件版本号的比较

    //js实现软件版本号的比较 //随机举两个例子 pc2.4.3 或者pc3.5.6 /** * 输入 v1,v2 * 返回true代表v1比v2的版本新,false则代表v1与v2相等或者v1&lt ...