【发布时间】:2010-09-14 14:32:22
【问题描述】:
我正在编写一个应用程序,它读取大量浮点数并对其执行一些简单的操作。我正在使用浮点数,因为我认为它会比双精度数更快,但是在做了一些研究之后,我发现这个话题有些混乱。谁能详细说明一下?
【问题讨论】:
标签: c# performance floating-point precision
我正在编写一个应用程序,它读取大量浮点数并对其执行一些简单的操作。我正在使用浮点数,因为我认为它会比双精度数更快,但是在做了一些研究之后,我发现这个话题有些混乱。谁能详细说明一下?
【问题讨论】:
标签: c# performance floating-point precision
你错了。 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 位操作系统。
【讨论】:
浮点数在 32 位系统上应该更快,但分析代码以确保优化正确。
【讨论】:
简短的回答是,“使用可接受的结果所需的任何精度。”
您的一项保证是,对浮点数据执行的操作至少在表达式的最高精度成员中完成。因此,将两个 float 相乘至少达到 float 的精度,然后将 float 和 double 相乘> 将至少以双精度完成。该标准规定“[浮点] 运算可以以比运算结果类型更高的精度执行。”
鉴于 .NET 的 JIT 试图让您的浮点运算保持所要求的精度,我们可以查看 Intel 的文档以加快我们的运算速度。在 Intel 平台上,您的浮点运算可能以 80 位的中间精度完成,并转换为要求的精度。
来自 Intel 的 C++ 浮点操作指南1(抱歉只有死树),他们提到:
- 除非需要通过 double 或 long double 获得的额外精度,否则请使用单精度类型(例如,float)。更高精度的类型会增加内存大小和带宽要求。 ...
- 避免混合数据类型的算术表达式
最后一点很重要,因为 you can slow yourself down with unnecessary casts to/from float and 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 考试的官方书籍应该有一定的分量。这当然不是保证。我只是想我会把它添加到这个讨论中。
【讨论】:
我正在编写一个光线追踪器,并将我的 Color 类的浮点数替换为双精度数可以使我的速度提高 5%。用 double 替换 Vectors 浮点数再快 5%!很酷:)
Core i7 920 是这样的
【讨论】:
对于 387 FPU 算术,float 仅在某些长迭代操作(如 pow、log 等)中比 double 快(并且仅当编译器正确设置 FPU 控制字时)。
使用打包的 SSE 算法,它会产生很大的不同。
【讨论】:
几周前我提出了一个类似的问题。底线是对于 x86 硬件,浮点数与双精度数的性能没有显着差异,除非您受到内存限制,或者您开始遇到缓存问题。在这种情况下,浮点数通常具有优势,因为它们更小。
当前的 Intel CPU 在 80 位宽的寄存器中执行所有浮点运算,因此实际计算速度不应在浮点数和双精度数之间变化。
【讨论】:
如果加载和存储操作是瓶颈,那么浮点数会更快,因为它们更小。如果您在加载和存储之间进行大量计算,它应该大致相等。
其他人提到避免浮点和双精度之间的转换,以及使用这两种类型的操作数的计算。这是个好建议,如果您使用任何返回双精度的数学库函数(例如),那么将所有内容都保留为双精度会更快。
【讨论】:
这表明浮点数比双精度数稍快:http://www.herongyang.com/cs_b/performance.html
一般来说,在进行性能比较时,您应该考虑任何特殊情况,例如使用一种类型是否需要额外的转换或数据按摩?这些加起来可能会掩盖这样的通用基准。
【讨论】: