.net 性能优化4

C#写的代码,有个地方稍不留神,就产生了对性能的严重影响 ,那就是隐式转换。看一下代码:

int a = 0;
uint b = 0;
if (a > b)
{
}

这代码一眼看上去,什么问题都没有,更可恶的是,连编译警告都没有,我绝对认为这是不应该的。因为int跟uint的取值范围不同,为了确保比较出来的结果正确,编译器自动把a转换成long,把b转换成ulong,进行比较,比较的答案很正确,却严重影响了性能。

如果在代码中,能确定a、b都不会超出int的的最大值,绝对可以uint转换成int来进行比较,性能能大大提高。看一下两段测试代码:

没有手动进行转换:

int start = Environment.TickCount;
int a = 0;
uint b = 0;
while (a < 1000000000)
{
    
if (a <= b) a++;
    
if (a > b) b++;

    
if (a <= b) a++;
    
if (a > b) b++;

    
if (a <= b) a++;
    
if (a > b) b++;

    
if (a <= b) a++;
    
if (a > b) b++;
}
Console.WriteLine(Environment.TickCount 
- start);

我电脑的测试时间大概是3.3秒

 

int start = Environment.TickCount;
int a = 0;
uint b = 0;
while (a < 1000000000)
{
    
if (a <= (int)b) a++;
    
if (a > (int)b) b++;

    
if (a <= (int)b) a++;
    
if (a > (int)b) b++;

    
if (a <= (int)b) a++;
    
if (a > (int)b) b++;

    
if (a <= (int)b) a++;
    
if (a > (int)b) b++;
}
Console.WriteLine(Environment.TickCount 
- start);

我电脑的测试时间大概是1.3秒

这点不起眼的改动,程序快了2.5倍。(循环体中之所以加上多句判断,是因为想减少循环计数对测试时间的影响。)

技术讨论的QQ群: 2514097 或 10987609 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值