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类型的话,代码恐怕会非常的慢。