c# 性能总结

本文介绍了C#中几种有效的代码优化方法,包括使用右移代替除法运算、预计算优化、减少冗余计算以及内联方法的应用。通过具体示例展示了这些技巧如何显著提升程序性能。

1.str.Length ==  0> str == string.Empty

2.string str = ""    < string str = string.Empty;

3.StringBuilder s = new StringBuilder("your string");

s.Append("you want to add");

4.create and use string;not creating don't use;

 

右移和预计算优化是有效的

如今网络上有一种呼声,说现在的编译器足够智能,会对代码自动地进行一些常见的优化,一些老的优化方法已经不再适用了,比如用右移代替除法运算、预计算等等;

很可惜,如今的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));  

}

 

 

内联表示在编译时,在对每一个方法的调用处都加上实际的方法代码,而不是只包含对该方法的引用。这样做的结果是虽然增加了输出文件的长度,但是由于减少了对方法调用的开销,从而加快了程序的运行速度。

声明内联的方法是在方法的定义中加上inline关键字。

在.NET环境中使用内联方法可以减少对虚方法的使用,降低系统的开销。同样,我们也推荐尽量使用密封类和密封方法。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值