c# - float 比双倍慢吗? 64位程序运行速度比32位程序快吗?

标签 c# java c++ c static-typing

使用 float 类型是否比使用 double 类型慢?

我听说现代 Intel 和 AMD CPU 使用 double 计算比使用 float 更快。

标准数学函数(sqrtpowlogsincos 等)?以单精度计算它们应该会快得多,因为它应该需要更少的浮点运算。例如,单精度 sqrt 可以使用比 double sqrt 更简单的数学公式。另外,我听说标准数学函数在 64 位模式下更快(在 64 位操作系统上编译和运行时)。对此有什么明确的答案?

最佳答案

经典的 x86 架构使用浮点单元 (FPU) 来执行浮点计算。 FPU 在其内部寄存器中执行所有计算,每个寄存器都有 80 位精度。每次您尝试使用 floatdouble 时,首先将变量从内存加载到 FPU 的内部寄存器中。这意味着实际计算的速度绝对没有差异,因为在任何情况下,计算都是以完全 80 位精度执行的。唯一可能不同的是从内存加载值并将结果存储回内存的速度。自然,与 float 相比,在 32 位平台上加载/存储 double 可能需要更长的时间。在 64 位平台上应该没有任何区别。

现代 x86 架构通过新指令支持扩展指令集 (SSE/SSE2),这些指令可以在不涉及“旧”FPU 指令的情况下执行完全相同的浮点计算。但是,我不希望看到 floatdouble 的计算速度有任何差异。由于这些现代平台是 64 位的,因此加载/存储速度也应该是相同的。

在不同的硬件平台上,情况可能会有所不同。但通常较小的浮点类型不应提供任何性能优势。较小的浮点类型的主要目的是节省内存,而不是提高性能。

编辑:(解决@MSalters 评论) 我上面所说的适用于基​​本的算术运算。当谈到库函数时,答案将取决于几个实现细节。如果平台的浮点指令集包含实现给定库函数功能的指令,那么我上面所说的通常也适用于该函数(通常包括 sin 之类的函数, cossqrt)。对于其他功能,其功能在 FP 指令集中没有立即得到支持,情况可能会大不相同。这些函数的 float 版本很可能比它们的 double 版本更有效地实现。

关于c# - float 比双倍慢吗? 64位程序运行速度比32位程序快吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5738448/

相关文章:

c# - 从反射树切换到表达式树

c# - Unity 的自定义对象工厂扩展

java - apache tomat7 没有在浏览器中启动?

c++ - 在 C++ 中使用 xlslib

c++ - iMX6 上的 Qt5 : performance advantage on running on platform eglfs vs xcb

c# - 如何配置 WCF 以将 HTTP 与客户端证书一起使用?

c# - 使用 XPath 和 C# 选择 HTML 表格的下拉选项

java - Lombok + Java 13 模块 + NetBeans 11 + Maven

java - 了解非最终类的克隆方法

java - 将 RGB2CMYK 方法从 c++ 移植到 java 时遇到问题