浮动与双重performance
我做了一些时间testing,还读了一些像这样的文章(最后一条评论),看起来像在发布构build,浮点数和双精度值采取相同的处理时间量。
这怎么可能? 当float与double值相比精确度和精度较低时,CLR如何能够在相同的处理时间内翻倍?
编辑:
完全重复的“ 比c中的花车快两倍 ”
在x86处理器上,至lessfloat
和double
float
将被FPU转换为10字节的实数,以供处理。 FPU没有针对它所支持的不同浮点types的单独处理单元。
当大多数CPU没有内置FPU(而且很less有人拥有独立的FPU芯片)时,浮点运算的古老build议比100年前的double
快,所以大多数浮点运算都是用软件完成的。 在这些机器上(由熔岩坑产生的蒸汽驱动),使用float
的速度更快。 float
的唯一真正的好处是它们占用更less的空间(只有当你拥有数以百万计的空间时才有意义)。
我有一个使用CUDA的小型项目,我记得float也比那里快了一倍。 一旦主机和设备之间的stream量较低(主机是CPU,“普通”RAM和设备是GPU和相应的RAM)。 但即使数据总是驻留在设备上,速度也会变慢。 我觉得我在某个地方看到这个最近已经改变了,或者应该和下一代改变,但我不确定。
所以看起来在这种情况下,GPU本身不能处理双精度,这也解释了为什么GLFloat通常被使用而不是GLDouble。
(正如我所说的,就我所能记得的,在searchfloat和double时偶然发现了这个问题。)
取决于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); }
但是仍然有些情况下浮动是优先的 – 例如OpenGL编码,使用GLFloat数据types(通常直接映射到16位浮点数)更为常见,因为它在大多数GPU上比GLDouble