c#中关于sealed修饰类的性能提升的测试
在clr var c#一书中,作者描述当用sealed修饰类时,可以提高系统性能而且建议大家也养成用sealed来修饰类的习惯。由于对性能二字比较敏感,所以本文先测试一下用sealed分别修饰和不修饰类时,new1亿次的时间,然后说一下我的看法,如果有更好的测试方法,欢迎大家在此交流。
首先上我的测试代码:
class Program
{
static void Main(string[] args)
{
for (int j = 0; j < 10; j++)
{
V t = new T();
V u = new U();
t.oo();
u.oo(); DateTime startTimeT = DateTime.Now; for (int i = 0; i < 100000000; i++)
{
t.oo();
} DateTime endTimeT = DateTime.Now;
TimeSpan spanT = endTimeT - startTimeT;
Console.WriteLine("not sealed class:" + spanT.Milliseconds.ToString()); DateTime startTimeU = DateTime.Now;
for (int i = 0; i < 100000000; i++)
{
u.oo();
}
DateTime endTimeU = DateTime.Now;
TimeSpan spanU = endTimeU - startTimeU;
Console.WriteLine("sealed class:" + spanU.Milliseconds.ToString());
Console.WriteLine();
}
Console.ReadKey();
}
} class T : V
{
public override string oo()
{
return "Hello Another";
}
} sealed class U:V
{
public override string oo()
{
return "Hello Another";
}
} class V
{
public virtual string oo()
{
return "Hello Another";
}
}
运行结果: 
结果让我大吃一惊,用sealed修饰的类除了第一次快了2毫秒外,剩下九次结果都慢大约五六毫秒,为什么修饰完以后效率反而下降了呢。当用sealed修饰类以后, 1.有助于JIT内联;2.消除了协变与逆变和后期绑定,使CLR直接执行这个实例。
先说说“第1点”,促使JIT内联代码的因素有很多,JIT不会因为一个类是sealed,就去装入其中的内容,而对于sealed类内部方法的内联,很大原因也是由于方法槽映射关系决定的,sealed作用有待考证。
第2点,由于sealed类不可派生或被继承,所以的确在运行时省去可CLR一些额外的工作,但是这些工作只是一些类似于“寻址”的工作,因为虚拟方法表已经完成了运行时与编译时的对应关系,纯粹的运行时只是在寻找这些关系而已,所以sealed省去的只是一部分较为复杂的寻址关系,因为即使没有继承,也不可避免一个方法表的应用。(上述两点参考http://kb.cnblogs.com/page/73598/)
之所以CLR via C#一书中会这么写,完全是因为作者本人的编程习惯。Jeffrey Richter不喜欢过分开放的对象,能private的绝对不public,除非确定要作为基类,不然一定会用sealed封死。
写到这里,我又忍不住多测了几遍,发现有时候修饰候后慢50多毫秒(460 vs 410),结果证明不但没快反而慢了好多,希望有知道原因的大牛指点一下^.^
c#中关于sealed修饰类的性能提升的测试的更多相关文章
- C# 中的sealed修饰符学习
转载原地址 http://developer.51cto.com/art/200908/147327.htm C#语言还是比较常见的东西,这里我们主要介绍C# sealed修饰符,包括介绍两个修饰符在 ...
- 如何利用缓存机制实现JAVA类反射性能提升30倍
一次性能提高30倍的JAVA类反射性能优化实践 文章来源:宜信技术学院 & 宜信支付结算团队技术分享第4期-支付结算部支付研发团队高级工程师陶红<JAVA类反射技术&优化> ...
- C#中关键字ref修饰类对象或结构体[转]
using System; using System.Collections.Generic; using System.Text; namespace CSharpTest { struct Dog ...
- 在Vue中遇到的各种坑 及性能提升
Vue: (1) 没有再模板里引用data数据,会不会引起update.beforeUpdate生命周期函数的执行? 不会 (2)组件改成异步 (3)v-once (4)如果不用template ...
- 性能提升40%: 腾讯 TKE 用 eBPF 绕过 conntrack 优化 K8s Service
Kubernetes Service 用于实现集群中业务之间的互相调用和负载均衡,目前社区的实现主要有userspace,iptables和IPVS三种模式.IPVS模式的性能最好,但依然有优化的空间 ...
- 腾讯 TKE 厉害了!用 eBPF绕过 conntrack 优化K8s Service,性能提升40%
Kubernetes Service[1] 用于实现集群中业务之间的互相调用和负载均衡,目前社区的实现主要有userspace,iptables和IPVS三种模式.IPVS模式的性能最好,但依然有优化 ...
- c#中sealed修饰符
sealed 修饰符表示密封 用法: 1.用于类时,表示该类不能再被继承,不能和abstract同时使用,因为这两个修饰符在含义上互相排斥 2.用于方法和属性时,表示该方法或属性不能再被重写,必须和o ...
- Java中为什么有abstract interface 修饰类?
如果有人问你为什么有abstract interface 修饰类,答案一定是他看到的这种方式一定是反编译出来的结果.实际中abstract interface和interface修饰的类没有区别. 下 ...
- 类中被final修饰的成员变量需要初始化
类中被final修饰的成员变量需要初始化,否则编译不通过,因为final修饰后不能再赋值,因此必须初始化.
随机推荐
- Set <STL>
set是维护集合的容器 #include <cstdio> #include <set> using namespace std; int main() { //声明 set& ...
- Eclipse UML 工具 ObjectAid 介绍
概要 本文介绍如何使用 ObjectAid(http://www.objectaid.com/) UML Explorer 创建 UML 图,高速阅读代码. 安装 ObjectAid ObjectAi ...
- iis配置网址(主机名)
一直以来,常常弄不成功关于网址的问题. 今天查了下资料 首先,找到你的文件:C:\Windows\System32\drivers\etc的hosts文件,直接用记事本打开 # Copyright ( ...
- hdu1881 毕业bg(深搜索dfs)
主题链接:pid=1881">http://acm.hdu.edu.cn/showproblem.php? pid=1881 ----------------------------- ...
- 基于Qt语音识别功能
基于在最近的研究Qt语音识别平台下.在此记录12 首先,语音识别做三件事 1.记录用户的语音文件到本地 2.将用户语音编码 使用flac或者speex进行编码 3.使用第三方语音识别API或者SDK进 ...
- 2013级C++第13周(春)项目——继承的进一步话题与GUI应用开发
课程首页在:http://blog.csdn.net/sxhelijian/article/details/11890759,内有完整教学方案及资源链接 第一部分 程序阅读:阅读以下类的定义,请说出在 ...
- Linux svnserver存储路径和文件的详细解释
svn有两种存储方式:BDB和FSFS,眼下用的最多的是FSFS方式,这样的方式的话.通常是存储在\db\revs目录下,里面有一堆以版本命名的文件.如:0.1.2.3.4......,那个就是了 比 ...
- 【Android UI设计和开发】动画(Animation)详细说明(一)
Android开发之动画效果浅析 请尊重他人的劳动成果.转载请注明出处:Android开发之动画效果浅析 程序执行效果图: Android动画主要包括补间动画(Tween)View Animation ...
- 【百度地图API1.1】修改文本标注的样式
原文:[百度地图API1.1]修改文本标注的样式 百度地图API1.0中文本标注的样式写法为: label.getDom().style.borderColor = "#808080&quo ...
- MVC创建XML,并实现增删改
原文:MVC创建XML,并实现增删改 如果创建如下的XML: <?xml version="1.0" encoding="utf-8" standalon ...