我做了一些计时测试,也读了一些像this one (上一条评论)这样的文章,看起来在发布版本中,浮点值和双精度值占用了相同的处理时间。
这怎麽可能?当浮点数与双精度值相比精度较低且较小时,CLR如何在相同的处理时间内获得双精度值?
发布于 2009-01-06 18:15:38
至少在x86处理器上,float和double将各自转换为10字节的实数进行处理。对于它支持的不同浮点类型,FPU没有单独的处理单元。
100年前,当大多数FPU都没有内置的FPU(而且很少人有单独的float芯片)时,人们一直认为double比FPU更快,所以大多数浮点操作都是在软件中完成的。在这些机器上(由熔岩坑产生的蒸汽提供动力),使用floats的速度更快。现在floats唯一的真正好处是它们占用的空间更少(只有当你有数百万个这样的机器时,这才是重要的)。
发布于 2012-07-13 17:37:13
它依赖于32位或64位系统。如果编译到64位,double会更快。在64位(机器和操作系统)上编译为32位使float的速度提高了约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);
}发布于 2010-07-06 07:24:17
我有一个小项目,在那里我使用了CUDA,我记得float也比那里快了一倍。这一次,主机和设备之间的流量较低(主机是CPU和“正常”RAM,设备是GPU和相应的RAM )。但是,即使数据一直驻留在设备上,它也会变得更慢。我想我在某处读到,这最近已经改变了,或者应该随着下一代的改变而改变,但我不确定。
因此,在这些情况下,图形处理器似乎根本无法处理双精度,这也解释了为什么通常使用GLFloat而不是GLDouble。
(正如我所说的,就我记忆所及,我是在CPU上搜索float和double时偶然发现的。)
https://stackoverflow.com/questions/417568
复制相似问题