C#效率优化(2)-- 方法内联
一、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); //320 myBaseClass = myClass; //多次赋值以使JIT编译器无法确认该变量的运行时类型 stopwatch.Restart(); for (int i = 0; i < 1000000000; i++) {myBaseClass.MyFunc(); } Console.WriteLine(stopwatch.ElapsedMilliseconds); //1600 stopwatch.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… }
如果您觉得阅读本文对您有帮助,请点一下“推荐”按钮,您的认可是我写作的最大动力!
作者:Minotauros
出处:https://www.cnblogs.com/minotauros/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
转载于:https://www.cnblogs.com/minotauros/p/10341386.html
C#效率优化(2)-- 方法内联相关推荐
- jit 方法内联_JIT编译器,内联和转义分析
jit 方法内联 即时(JIT) 即时(JIT)编译器是Java虚拟机的大脑. JVM中对JIT编译器的影响最大. 一会儿,让我们退后一步,看看已编译和未编译语言的示例. 诸如Go,C和C ++之类的 ...
- jvm 方法内联_方法内联在JVM中有多积极?
jvm 方法内联 在IntelliJ IDEA中使用Ctrl + Alt + M 提取方法 . Ctrl + Alt + M. 这就像选择一段代码并按此组合一样简单. Eclipse也有它 . 我讨厌 ...
- 方法内联在JVM中有多积极?
IntelliJ IDEA中使用Ctrl + Alt + M 提取方法 . Ctrl + Alt + M. 这就像选择一段代码并按此组合一样简单. Eclipse也有它 . 我讨厌冗长的方法. 对于我 ...
- java 内联调用深度_Java中内联虚拟方法调用的性能
java 内联调用深度 总览 动态编译的好处之一是它能够支持在虚拟方法代码上的广泛方法内联. 内联代码可提高性能时,代码仍必须检查类型(以防由于优化而更改了类型)或在多个可能的实现之间进行选择. 这导 ...
- Java内联虚拟方法调用的性能
总览 动态编译的好处之一是,它能够支持在虚拟方法代码上进行广泛的方法内联. 虽然内联代码可以提高性能,但是代码仍然必须检查类型(以防由于优化而更改了类型)或在多个可能的实现之间进行选择. 这导致了问题 ...
- Javascript性能优化【内联缓存】 V8引擎特性
javascript 是单线程.动态类型语言,那么我们在编码时候如何编写性能最优代码呢?下面将讲解V8引擎的内联优化.利用内联缓存这个特性我们可以编写更加优秀的代码. 什么是内联缓存 引用官方的描述: ...
- Android P内联优化导致的一个诡异Bug
问题背景 最近,我们的业务在动态加载一款第三方游戏时出现了奇怪的现象,本地开发测试体验良好,但是使用CI构建的正式包体验时会出现启动闪退. 问题分析 分析日志 首先,我们自然而然看了下Crash日志, ...
- 【JVM】JVM 内联优化
文章目录 1.概念 2.过程 3.场景 4.案例 5.案例2 6.java内联配置 7.方法内联的规则 8.案例 8.1 内联案例1 1.概念 内联概念:把函数调用的方法直接内嵌到方法内部,减少函数调 ...
- C++内联函数学习总结
C++中的内联函数inline总结 http://blog.csdn.net/coder_xia/article/details/6723387 突然看到C++Primer中讲到,对于vector的一 ...
- C++11 中的内联函数、auto关键字、for循环及空指针
C++ 3 内联函数 概念 特性 auto关键字 定义 使用 auto与指针结合起来使用 在同一行定义多个变量 auto不能推导的场景 auto不能作为函数的参数 auto不能直接用来声明数组 基于范 ...
最新文章
- 空气球+操作系统,海尔智能家居雄心何在?
- Robocopy是微软Windows Server 2003资源工具包中众多多用途的实用程序之一(它是基于强大的拷贝程序...
- GitHub趋势榜第一的开源低代码项目:mometa
- LeetCode119.杨辉三角II
- 数据结构:平衡二叉树概念、旋转
- 如何计算一个神经网络在使用momentum时的hessian矩阵(论文调研)
- MFC菜单栏(CMenu)控件
- 趣读:程序员泪流满面的20个瞬间!
- C++设计模式-Builder建造者模式
- npm常用命令(扩展中...)
- 利用 Windows Server 容器攻陷云环境的首款恶意软件现身
- 解决cef加载flash时弹出黑框的问题
- Win XP 经典壁纸拍摄地 24 年后变样了
- Maven中的pom.xml文件超详细解析
- pytorch is not compiled with NCCL supoort
- win7查找计算机在哪里,win7搜索在哪
- laravel 5.5 The page has expired due to inactivity. Please refresh and try again
- 查看linux 系统 服务器型号
- Blender_7_倒角
- 用python画一个汉字_python使用reportlab画图示例(含中文汉字)
热门文章
- springmvc框架原理学习
- 我要发明计算机作文,我要发明机器人作文700字
- apicloud开发时的一些注意点
- 二、Linux常用命令——文件处理命令
- 唯一分解,逆元,正约数个数和正约数和,欧拉筛
- 一文带你了解微信/支付宝支付的相关概念
- dubbox 2.8.4的配置和使用
- 阶段5 3.微服务项目【学成在线】_day04 页面静态化_03-freemarker测试环境搭建
- 阶段3 3.SpringMVC·_01.SpringMVC概述及入门案例_05.入门程序之入门代码编写
- 阶段3 2.Spring_05.基于XML的IOC的案例1_3 测试基于XML的IOC案例