C#写的代码,有个地方稍不留神,就产生了对性能的严重影响 ,那就是隐式转换。看一下代码:
int a = 0;
uint b = 0;
if (a > b)
{
}
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);
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);
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