.net 浮动vs双性能

j1dl9f46  于 2023-10-21  发布在  .NET
关注(0)|答案(5)|浏览(94)

我做了一些计时测试,也读了一些类似的文章(最后一条评论),看起来在发布构建中,浮点数和双精度值需要相同的处理时间。
这怎么可能?当float与double值相比精度较低且较小时,如何在相同的处理时间内获得double值?

aiazj4mn

aiazj4mn1#

在x86处理器上,至少floatdouble将分别由FPU转换为10字节的真实的进行处理。FPU对于它支持的不同浮点类型没有单独的处理单元。
floatdouble更快的古老建议在100年前就应用了,当时大多数CPU都没有内置的FPU(很少有人有单独的FPU芯片),因此大多数浮点操作都是在软件中完成的。在这些机器上(由熔岩坑产生的蒸汽提供动力),使用float s会更快。现在float s唯一真实的好处是它们占用的空间更少(只有当您有数百万个它们时才有关系)。

gcxthw6b

gcxthw6b2#

取决于32位64位系统。如果你编译到64位,double会更快。在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);
    }
bxpogfeg

bxpogfeg3#

我有一个使用CUDA的小项目,我记得float的速度也比两倍快。主机和设备之间的流量一度较低(主机是CPU和“正常”RAM,设备是GPU和相应的RAM)。但是,即使数据一直驻留在设备上,它也会变慢。我想我在某个地方读到过,这种情况最近已经改变了,或者应该随着下一代而改变,但我不确定。
因此,在这些情况下,GPU似乎根本无法处理双精度,这也解释了为什么通常使用GLFloat而不是GLDouble。
(As我说这只是我能记得,只是偶然发现这一点,而寻找浮动与。在CPU上加倍)。

g9icjywg

g9icjywg4#

仍然有一些情况下,浮点数是首选的,例如OpenGL编码,使用GLFloat数据类型(通常直接Map到16位浮点数)更为常见,因为它在大多数GPU上比GLDouble更有效。

7fyelxc5

7fyelxc55#

2023年9月在Apple Silicon、Intel Core和AMD 64位CPU上测试了这些案例。专门测量了将double交换为float如何改变性能。
float版本的性能总是更差,根据CPU的不同,速度会降低1-12%。更多详情请点击此处:https://dev.to/maximsaplin/c-float-vs-double-performance-considerations-2o8k

相关问题