关于静态方法与非静态方法的执行效率
来源:互联网 发布:软件著作权 翻译 编辑:程序博客网 时间:2024/05/16 11:51
以前看到许多网友认为静态方法要比实例方法在执行效率上要快一些,当初不敢苟同。自己亲自试了一把,发现静态方法确实要快一些。
想要比较静态方法与非静态方法的执行效率,需要对CLR在调用静态方法与非静态方法时的不同之处要有一个了解。
静态方法是与类相关联的,CLR在调用一个静态方法时需要做的事情就是找到定义该方法的类型即可实现调用;而在调用非静态方法时,为了保证运行安全,CLR会对我们的源代码进行验证并额外的生成一些IL中间代码来确保运行安全,所以在调用一个非静态方法时,CLR首先是判定被调用对象是否为NULL,如果为NULL,则引发一个异常,反之,则根据对象推荐出其类型,最后实现调用。可以看出来,在调用静态方法来非静态方法时,后者比前者多做了一些工作,这将造成性能上的损失。所以,静态方法在执行效率上可能要比非静态方法要好一些。IL中可以看到非静态方法执行的是callvirt 指令:
CLR via C#的解释:调用一个静态方法时,CLR会定位与定义静态方法的类型对应的类型对象。然后,JIT编译器在类型对象的方法表中查找与被调用的方法对应的记录项,对方法进行JIT编译(如果需要的话),再调用JIT编译的代码。过程图如下:
一般情况下声明静态方法的类大多是工具类,并且这些静态方法不需要访问类型中的非静态字段和事件,也就是说静态方法与该类型中的非静态字段和事件不具有逻辑上的关联性。如果一个方法声明为静态方法,也意味着不能被重写,该方法失去面向对象的扩展和多态的特性。
总结:静态方法与实例方法在性能和占用内存上没有明显的区别,是否声明为静态方法需要从类型的非静态字段、事件、面向对象扩展和多态这三方面来考虑。
- 关于静态方法与非静态方法的执行效率
- 关于静态块,静态方法,非静态方法,构造方法执行的顺序
- 静态与非静态方法
- 关于静态方法和非静态方法的心得
- 阿里面试题:关于类中静态,非静态,构造方法的执行顺序
- 关于类中静态,非静态,构造方法的执行顺序
- 阿里面试题:关于类中静态,非静态,构造方法的执行顺序
- 阿里面试题:关于类中静态,非静态,构造方法的执行顺序
- 关于类中静态,非静态,构造方法的执行顺序
- 关于类中静态,非静态,构造方法的执行顺序
- 思考:关于静态与非静态java方法
- 关于Java中静态方法与非静态方法之间的互相调用问题
- 静态方法与非静态方法
- C#静态方法与非静态方法
- 静态方法与非静态方法区别
- 静态方法与非静态方法
- java中静态块,静态方法,非静态方法,构造方法执行的顺序
- 总结java中静态块,静态方法,非静态方法,构造方法执行的顺序
- 超链接—a标签的使用
- Android业务组件化之Gradle和Sonatype Nexus搭建私有maven仓库
- 凸优化(Convex Optimization)是什么?
- Linux--信号处理:在某个信号发生时屏蔽其他的信号
- html+css基础1-head
- 关于静态方法与非静态方法的执行效率
- hiho1268 九宫(DFS练习)
- BZOJ 1209([HNOI2004]最佳包裹-三维凸包)
- GAN——LSGANs(最小二乘GAN)
- Solr搜索服务的搭建(Liunx)
- The Basics of Configiration System -- ConfigNamespace and ConfigOption
- java使用递归,非递归方式实现二叉树的三种常见遍历方式
- Java常见异常
- cocos2dx 获取某像素点的rgba值