我进行了一些计时测试,也阅读了一些类似这篇文章(最后一条评论),看起来在Release版本中,float和double值处理时间相同。
那么这是怎么实现的呢?当float比double值精度低且更小的时候,CLR如何使得它们在处理时间上相同呢?
我进行了一些计时测试,也阅读了一些类似这篇文章(最后一条评论),看起来在Release版本中,float和double值处理时间相同。
那么这是怎么实现的呢?当float比double值精度低且更小的时候,CLR如何使得它们在处理时间上相同呢?
float
和double
至少会被FPU转换为10字节实数以便进行处理。FPU没有为其支持的不同浮点类型单独的处理单元。float
比double
快的建议是过时的,这种建议在100年前适用,当时大多数CPU没有内置FPU(很少有人有单独的FPU芯片),因此大多数浮点运算是通过软件完成的。在那些由熔岩坑生成蒸汽驱动的机器上,使用float
确实更快。现在,float
唯一的真正好处是占用更少的空间(只有在需要处理数百万个浮点数时才有意义)。这取决于系统是32位还是64位。如果你编译为64位,那么双精度浮点数会更快。在64位(机器和操作系统)上编译成32位可以使浮点数速度提高约30%:
public static void doubleTest(int loop)
{
Console.Write("double: ");
for (int i = 0; i < loop; i++)
{
double a = 1000, b = 45, c = 12000, d = 2, e = 7, f = 1024;
a = Math.Sin(a);
b = Math.Asin(b);
c = Math.Sqrt(c);
d = d + d - d + d;
e = e * e + e * e;
f = f / f / f / f / f;
}
}
public static void floatTest(int loop)
{
Console.Write("float: ");
for (int i = 0; i < loop; i++)
{
float a = 1000, b = 45, c = 12000, d = 2, e = 7, f = 1024;
a = (float) Math.Sin(a);
b = (float) Math.Asin(b);
c = (float) Math.Sqrt(c);
d = d + d - d + d;
e = e * e + e * e;
f = f / f / f / f / f;
}
}
static void Main(string[] args)
{
DateTime time = DateTime.Now;
doubleTest(5 * 1000000);
Console.WriteLine("milliseconds: " + (DateTime.Now - time).TotalMilliseconds);
time = DateTime.Now;
floatTest(5 * 1000000);
Console.WriteLine("milliseconds: " + (DateTime.Now - time).TotalMilliseconds);
Thread.Sleep(5000);
}
Math
使用的是 double。但你误读了我的帖子:我的测试表明 float 在性能上更好。 - Bitterbluefloat
和double
的性能几乎相同。在许多独立的试验中平均下来,每个试验都对连续链接的变量执行乘法、除法和加法操作(以避免任何编译器优化妨碍测试),两者之间的差异不到0.3%。我进行了第二组测试,使用了Math.Sin()
和Math.Sqrt()
,也得到了相同的结果。 - Special Sauce我曾做过一个小项目,使用了CUDA,我记得在那个项目中,float 的速度比 double 快。因为 Host(即 CPU 和普通 RAM)与 Device(即 GPU 和相应的 RAM)之间的通信较少。但即使数据始终驻留在 Device 上,速度仍然较慢。我想我在某处读到过,最近或者下一代可能会有所改变,但不确定。
因此,似乎在这些情况下,GPU 不能本地处理双精度浮点数,这也可以解释为什么通常使用 GLFloat 而不是 GLDouble。
(正如我所说,这只是我记得的情况,在搜索 CPU 上的 float vs. double 时偶然发现的。)
然而,仍有一些情况下需要使用浮点数 - 例如在OpenGL编程中,常见的是使用GLFloat数据类型(通常直接映射到16位浮点数),因为它在大多数GPU上比GLDouble更高效。
double
替换为float
对性能的影响。
float
版本的性能始终较差,根据CPU的不同,性能下降了1-12%。更多详细信息请参考:https://dev.to/maximsaplin/c-float-vs-double-performance-considerations-2o8k