博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
关于静态方法与非静态方法的执行效率
阅读量:5263 次
发布时间:2019-06-14

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

以前看到许多网友认为静态方法要比实例方法在执行效率上要快一些,当初不敢苟同。自己亲自试了一把,发现静态方法确实要快一些。

  想要比较静态方法与非静态方法的执行效率,需要对CLR在调用静态方法与非静态方法时的不同之处要有一个了解。

  静态方法是与类相关联的,CLR在调用一个静态方法时需要做的事情就是找到定义该方法的类型即可实现调用;而在调用非静态方法时,为了保证运行安全,CLR会对我们的源代码进行验证并额外的生成一些IL中间代码来确保运行安全,所以在调用一个非静态方法时,CLR首先是判定被调用对象是否为NULL,如果为NULL,则引发一个异常,反之,则根据对象推荐出其类型,最后实现调用。可以看出来,在调用静态方法来非静态方法时,后者比前者多做了一些工作,这将造成性能上的损失。所以,静态方法在执行效率上可能要比非静态方法要好一些。IL中可以看到非静态方法执行的是callvirt 指令:

  CLR via C#的解释调用一个静态方法时,CLR会定位与定义静态方法的类型对应的类型对象。然后,JIT编译器在类型对象的方法表中查找与被调用的方法对应的记录项,对方法进行JIT编译(如果需要的话),再调用JIT编译的代码。过程图如下:

  一般情况下声明静态方法的类大多是工具类,并且这些静态方法不需要访问类型中的非静态字段和事件,也就是说静态方法与该类型中的非静态字段和事件不具有逻辑上的关联性。如果一个方法声明为静态方法,也意味着不能被重写,该方法失去面向对象的扩展和多态的特性。

总结:静态方法与实例方法在性能和占用内存上没有明显的区别,是否声明为静态方法需要从类型的非静态字段、事件、面向对象扩展和多态这三方面来考虑。

转载于:https://www.cnblogs.com/duanxz/p/5253100.html

你可能感兴趣的文章
修复公路
查看>>
【SAS NOTE】“:”&时间处理
查看>>
3-6局部变量的存储方式 & 3-7字符型字面值
查看>>
sgu 110 Dungeon
查看>>
Linux下关于进程的一些操作
查看>>
Hibernate学习(七)
查看>>
prim算法基础详解(无向赋权图的最小生成树MST)
查看>>
vijos1404 遭遇战
查看>>
Androidstudio创建项目jdk版本问题
查看>>
《般若波罗蜜多心经》全文及解释
查看>>
数字类型内置方法
查看>>
[转载]使用Openfiler构建ESXI网络共享存储iSCSI
查看>>
Android基于mAppWidget实现手绘地图(十四)–在一个应用中使用多个地图
查看>>
iOS开发核心动画之粒子效果
查看>>
实验1 查看CPU和内存,用机器指令和汇编指令编程
查看>>
Beta 冲刺(1/7)
查看>>
算法之经典排序-冒泡排序(bubble sort)
查看>>
python之Django实现商城从0到1
查看>>
利用CSS3中的clac()实现按照屏幕分辨率自适应宽度
查看>>
stm32单片机时钟中断的配置
查看>>