我正在编写一个应用程序,它读取大型浮点数组并使用它们执行一些简单的操作。我正在使用浮点数,因为我认为它会比双精度数更快,但是在做了一些研究之后,我发现这个话题有些混乱。谁能详细说明这一点?
10 回答
简短的回答是,“使用可接受的结果所需的任何精度。”
您的一个保证是对浮点数据执行的操作至少在表达式的最高精度成员中完成。因此,将两个float相乘至少以 float 的精度完成,而将float和double相乘至少以双精度完成。该标准规定“[浮点] 运算可以以比运算结果类型更高的精度执行。”
鉴于 .NET 的 JIT 试图让您的浮点运算保持要求的精度,我们可以查看 Intel 的文档以加快我们的运算速度。在英特尔平台上,您的浮点运算可能以 80 位的中间精度完成,并转换为要求的精度。
从 Intel's guide to C++ Floating-point Operations 1(抱歉只有死树),他们提到:
- 除非需要通过 double 或 long double 获得的额外精度,否则请使用单精度类型(例如,float)。更高精度的类型会增加内存大小和带宽要求。...
- 避免混合数据类型算术表达式
最后一点很重要,因为您可以通过对 float 和 double 的不必要强制转换来减慢自己的速度,这会导致 JIT 代码要求 x87 在操作之间放弃其 80 位中间格式!
1. 是的,它说的是 C++,但是 C# 标准加上 CLR 的知识让我们知道 C++ 的信息应该适用于这种情况。
我刚刚阅读了 MCTS 考试 70-536 的“Microsoft .NET Framework-Application Development Foundation 2nd”,第 4 页(第 1 章)有注释:
注意 使用内置类型
优化性能 运行时优化 32 位整数类型(Int32 和 UInt32)的性能,因此将这些类型用于计数器和其他经常访问的整数变量。对于浮点运算,Double 是最有效的类型,因为这些运算是由硬件优化的。
它是由托尼·诺斯鲁普(Tony Northrup)撰写的。我不知道他是否是权威,但我希望.NET 考试的官方书籍应该有一定的分量。这当然不是保证。我只是想我会把它添加到这个讨论中。
几周前我介绍了一个类似的问题。底线是对于 x86 硬件,浮点数与双精度数的性能没有显着差异,除非您受到内存限制,或者您开始遇到缓存问题。在这种情况下,浮动通常具有优势,因为它们更小。
当前的英特尔 CPU 在 80 位宽的寄存器中执行所有浮点运算,因此计算的实际速度不应在浮点数和双精度数之间变化。
如果加载和存储操作是瓶颈,那么浮点数会更快,因为它们更小。如果您在加载和存储之间进行大量计算,它应该大致相等。
其他人提到避免浮点和双精度之间的转换,以及使用这两种类型的操作数的计算。这是个好建议,如果您使用任何返回双精度的数学库函数(例如),那么将所有内容都保留为双精度会更快。
我正在编写一个光线追踪器,并用我的 Color 类的双精度数替换浮点数,使我的速度提高了 5%。用 double 替换 Vectors 浮点数再快 5%!很酷:)
那是Core i7 920
使用 387 FPU 算术,对于某些长迭代操作,如 pow、log 等(并且仅当编译器适当地设置 FPU 控制字),float 仅比 double 快。
使用打包的 SSE 算法,它会产生很大的不同。
你错了。32 位比 16 位效率高得多——在现代处理器中……也许不是内存方面的,但在有效性方面 32 位是要走的路。
您确实应该将您的教授更新为更“最新”的东西。;)
无论如何,回答这个问题;float 和 double 具有完全相同的性能,至少在我的 Intel i7 870 上(理论上如此)。
这是我的测量结果:
(我做了一个“算法”,我重复了 10,000,000 次,然后重复了 300 次,然后我做了一个平均值。)
double
-----------------------------
1 core = 990 ms
4 cores = 340 ms
6 cores = 282 ms
8 cores = 250 ms
float
-----------------------------
1 core = 992 ms
4 cores = 340 ms
6 cores = 282 ms
8 cores = 250 ms
我一直认为无论浮点还是双精度,处理器都经过优化或相同。在我的密集计算中搜索优化(大量从矩阵中获取,两个值的比较),我发现浮点数的运行速度快了大约 13%。
这让我感到惊讶,但我想这是由于我的问题的性质。我不会在操作的核心中在 float 和 double 之间进行强制转换,我的计算主要是加法、乘法和减法。
这是在我的 i7 920 上,运行 64 位操作系统。
这表明浮点数略快于双精度数:http ://www.herongyang.com/cs_b/performance.html
一般来说,任何时候进行性能比较时,都应该考虑任何特殊情况,比如使用一种类型是否需要额外的转换或数据按摩?这些加起来可能会掩盖这样的通用基准。
浮点数在 32 位系统上应该更快,但分析代码以确保您正在优化正确的东西。