C#代码优化性能优化.docx_第1页
C#代码优化性能优化.docx_第2页
C#代码优化性能优化.docx_第3页
C#代码优化性能优化.docx_第4页
C#代码优化性能优化.docx_第5页
全文预览已结束

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

C# 代码优化 性能优化自己所作的项目中开始慢慢接触到程序的优化部分,慢慢的对这些有了很多的理解。代码的书写规范化有助于团队中成员对你代码快速的理解。代码的优化有助于让程序运行速度更快一些。所以如下特转一些文字说明和本人的一些愚见。C#代码优化拾贝1、Float并不比Double要快软件测试和优化工作的一个重要原则是以实验为基础,一切以实验结果为准;我曾想当然的认为Float类型的位数少,理所当然应该比Double类型运算的要快。然而实验证明,这种想法是错误的;考察如下代码的速度:int i,j;float f1=7.125f,f2=7.125f;double d1=7.125d,d2=7.125d;DateTime dt = DateTime.Now;for ( i = 0; i 1000000000; i+ )f1 = f2 / 2.2f +12.3333f;TimeSpan ts = DateTime.Now - dt;MessageBox.Show ( ts.ToString() );dt = DateTime.Now;for ( i = 0; i 1000000000; i+ )d1 = d2 / 2.2d +12.3333d;ts = DateTime.Now - dt;MessageBox.Show(ts.ToString();运行这段代码,得到的结论是,Float类型和Double类型的运算速度完全一样;由此可见,如果把Double 类型换成Float,程序的速度不会有任何提升;如果仅仅是这样,我们还可以接受Float,因为毕竟Float比较省内存;然而,Float很不争气,我发现了他的一个致命弱点,把Float转化成int花费的时间太长了,比把Double类型转成整形所花费的时间多了一倍;想要验证这点的话,把刚才的代码改成这样:int i,j;float f1=7.125f,f2=7.125f;double d1=7.125d,d2=7.125d;DateTime dt = DateTime.Now;for ( i = 0; i 1000000000; i+ )/f1 = f2 / 2.2f +12.3333f;j = (int)f1;TimeSpan ts = DateTime.Now - dt;MessageBox.Show ( ts.ToString() );dt = DateTime.Now;for ( i = 0; i 1000000000; i+ )/d1 = d2 / 2.2d +12.3333d;j = (int)d1;ts = DateTime.Now - dt;MessageBox.Show(ts.ToString();在我们的组态元件的代码中,到处都是浮点转整形的运算(因为计算机图形需要光栅化,所以象素点坐标必须是整数),因此,如果我们使用Float类型的话,代码恐怕会非常的慢;2、右移和预计算优化是有效的如今网络上有一种呼声,说现在的编译器足够智能,会对代码自动地进行一些常见的优化,一些老的优化方法已经不再适用了,比如用右移代替除法运算、预计算等等;很可惜,如今的C# 虽然具有一些编译优化的功能,但还不象网络上所传颂的智能编译器那样的智能,经过实验发现,用右移代替除法运算、预计算等等技巧显然并未过时;经过实验发现:对于整形来说,右移一位确实比除以2要快一些,大约快了 6%。至于预计算,经过实验发现,表达式的写法影响了C# 的预计算功能,比如,i=j*(2d/3d)编译器就可以对其进行优化,编译的时候,编译器会先求出2d/3d的值,然后把结果0.66编译到目标代码中,所以实际编译的代码等价于i=j*0.66;而如果是 i=j*2d/3d ,编译器不会对其进行优化,所以,虽然两式运算结果完全相同,但是运算速度却是大相径庭;如果充分的利用预计算功能,可以极大的提高代码执行速度,比如,角度转弧度的运算,是把角度先乘以圆周率然后除以180。通常按照自然习惯,会这样写 j = k * Math.PI / 180.0;上式的写法显然没有利用到C#的预计算功能,而如果改成下式:j = k * (Math.PI / 180.0);就会发现,性能提高非常明显,大约快了70%;3、减少冗余计算优化前的代码如下所示,这是一个旋转点的函数,其中Sin(Angle),Cos(Angle)都各运算了两次,因此存在冗余计算。private Point RotatePt(double angle, Point pt)Point pRet = new Point();angle = -angle;pRet.X = (int)(double)pt.X * Math.Cos(angle) - (double)pt.Y * Math.Sin(angle);pRet.Y = (int)(double)pt.X * Math.Sin(angle) + (double)pt.Y * Math.Cos(angle);return pRet;优化的代码的方法就是消除冗余计算,优化后的代码如下:private Point RotatePt3(double angle, Point pt)Point pRet = new Point();angle = -angle;double SIN_ANGLE = Math.Sin(angle);double COS_ANGLE = Math.Cos(angle);pRet.X =(int)(pt.X * COS_ANGLE - pt.Y * SIN_ANGLE);pRet.Y = (int)(pt.X * SIN_ANGLE + pt.Y * COS_ANGLE);return pRet;优化后的代码,Sin(Angle),Cos(Angle)都只运算了一次,是“一次计算、两处使用”,性能提升大约30%如果想再进一步优化,可以去掉临时变量pRet,总体性能还能提升大约 5%,代码如下:private Point RotatePt(double angle, Point pt)angle = -angle;double SIN_ANGLE = Math.Sin(angle);double COS_ANGLE =Math.Cos (angle);return new Point(int)(pt.X * COS_ANGLE - pt.Y * SIN_ANGLE),(int)(pt.X * SIN_ANGLE + pt.Y * COS_ANGLE); 本文来自CSDN博客,转载请标明出处:/qiqi5521/archive/2006/12/20/1450609.aspx本人愚见string ax=string.Empty; 注:不要使用: string ax=; 判断ax是否为空:ax.Length=0 的效率要高于 ax=string.Empty,但我一般做的是ax.IsNullorEmpty对于不用改变的“变量”,记得用常量声明。尽量用foreach代替for循环,我记得在哪里看到过,foreach的运行花费时间是for的1/3,有待考证。还有就是循环体里面尽量不要写判断语句,因为会影响效率,毕竟你循环一次,程序就做一次判断,这样就有N次循环N次判断,效率大打折扣。记住,在for循环中,很多人喜欢for(int i=0;ixxx.Length;i+),最好可以把xxx.Length存入一个变量中,然后带入for循环,因为每次判断都会去读取xxx.Length值,这样无形中就浪费了时间,虽然智能的编译器会帮你完成这些,但最好你能明白这些。也请尽量别在循环内进行声明变量或初始化。对于IDisposed接口的,一般要记得用完就释放,所以嘛,一般声明的时候我就用us

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论