使用 float
类型是否比使用 double
类型慢?
我听说现代 Intel 和 AMD CPU 使用 double 计算比使用 float 更快。
标准数学函数(sqrt
、pow
、log
、sin
、cos
等)?以单精度计算它们应该会快得多,因为它应该需要更少的浮点运算。例如,单精度 sqrt
可以使用比 double sqrt
更简单的数学公式。另外,我听说标准数学函数在 64 位模式下更快(在 64 位操作系统上编译和运行时)。对此有什么明确的答案?
最佳答案
经典的 x86 架构使用浮点单元 (FPU) 来执行浮点计算。 FPU 在其内部寄存器中执行所有计算,每个寄存器都有 80 位精度。每次您尝试使用 float
或 double
时,首先将变量从内存加载到 FPU 的内部寄存器中。这意味着实际计算的速度绝对没有差异,因为在任何情况下,计算都是以完全 80 位精度执行的。唯一可能不同的是从内存加载值并将结果存储回内存的速度。自然,与 float
相比,在 32 位平台上加载/存储 double
可能需要更长的时间。在 64 位平台上应该没有任何区别。
现代 x86 架构通过新指令支持扩展指令集 (SSE/SSE2),这些指令可以在不涉及“旧”FPU 指令的情况下执行完全相同的浮点计算。但是,我不希望看到 float
和 double
的计算速度有任何差异。由于这些现代平台是 64 位的,因此加载/存储速度也应该是相同的。
在不同的硬件平台上,情况可能会有所不同。但通常较小的浮点类型不应提供任何性能优势。较小的浮点类型的主要目的是节省内存,而不是提高性能。
编辑:(解决@MSalters 评论)
我上面所说的适用于基本的算术运算。当谈到库函数时,答案将取决于几个实现细节。如果平台的浮点指令集包含实现给定库函数功能的指令,那么我上面所说的通常也适用于该函数(通常包括 sin
之类的函数, cos
、sqrt
)。对于其他功能,其功能在 FP 指令集中没有立即得到支持,情况可能会大不相同。这些函数的 float
版本很可能比它们的 double
版本更有效地实现。
关于c# - float 比双倍慢吗? 64位程序运行速度比32位程序快吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5738448/