比C#中的浮动更快吗?

我正在写一个应用程序读取大型浮点数组,并执行一些简单的操作。 我使用花车,因为我认为它会比双打快,但经过一些研究后,我发现这个话题有些混乱。 任何人都可以详细说明这一点?

简短的答案是“使用任何精度来达到可接受的结果”。

您的一个保证是在浮点数据上执行的操作至less在expression式的最高精度成员中完成。 所以乘以两个浮点数至less是浮点数的精度,乘以一个浮点数和一个double将至less用双精度来完成。 该标准规定:“[浮点]操作可以以比操作的结果types更高的精度执行”。

鉴于.NET的JIT试图以所要求的精度离开您的浮点运算,我们可以看一下英特尔的文档,以加速我们的运营。 在英特尔平台上,您可以以80位的中间精度完成浮点运算,并将其转换为所需的精度。

从英特尔指南到C ++浮点运算1 (对不起只有死树),他们提到:

  • 除非需要通过double或long double获得的额外精度,否则使用单精度types(例如float)。 更高的精度types会增加内存大小和带宽要求。 …
  • 避免混合的数据types算术expression式

最后一点很重要,因为你可以减慢不必要的转换到/从float和double ,这导致JIT'd代码要求x87在操作之间从80位中间格式转换掉!

1.是的,它表示C ++,但是C#标准加上CLR的知识让我们知道C ++的信息应该适用于这种情况。

几周前我提出了一个类似的问题。 底线是对于x86硬件来说,除非你变成内存绑定,否则浮动性能与双打性能没有显着差异,或者你开始遇到caching问题。 在这种情况下,花车通常会有优势,因为它们更小。

目前的英特尔CPU在80位宽的寄存器中执行所有的浮点操作,所以计算的实际速度不应该在浮点数和浮点数之间变化。

我刚刚阅读MCTS 70-536考试的“Microsoft .NET Framework-Application Development Foundation 2nd”,第4页(第1章)有一个注释:

注意使用内置types优化性能
运行时优化了32位整数types(Int32和UInt32)的性能,因此将这些types用于计数器和其他频繁访问的整型variables。 对于浮点操作,Double是最有效的types,因为这些操作是由硬件优化的。

这是Tony Northrup写的。 我不知道他是不是一个权威人士,但我希望.NET考试的官方书籍应该有一定的权重。 这当然不是一个保守派。 我只是想我会把它添加到这个讨论。

如果加载和存储操作是瓶颈,那么漂浮会更快,因为它们更小。 如果你在加载和存储之间进行大量的计算,它应该大致相等。

其他人提到避免float和double之间的转换,以及使用两种types操作数的计算。 这是很好的build议,如果你使用任何返回双精度的math库函数(例如),那么保持所有的双打将会更快。

我正在写一个射线跟踪器,并且用彩色class级的双打replace浮点数给我提高了5%。 用双打replacevector浮点数又快了5%! 很酷:)

这是与Core i7 920

使用387 FPUalgorithm,对于某些长时间的迭代操作,如pow,log等(只有在编译器正确设置FPU控制字时),float才会快于double。

随着SSEalgorithm的打包,它会有很大的不同。

Matthijs,

你错了。 在现代处理器中,32位的处理效率远高于16位处理器…也许不是内存方式,但效率是32位的。

你真的应该把你的教授更新为更“更新”的东西。 ;)

无论如何,要回答这个问题; 浮动和双重有完全相同的性能,至less在我的英特尔i7 870(理论上)。

这是我的测量:

(我做了一个“algorithm”,我重复了1000万次,然后重复了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 

这表明浮动比双打稍微快一些: http : //www.herongyang.com/cs_b/performance.html

一般来说,无论何时您对性能进行比较,您都应该考虑到任何特殊情况,比如使用一种types是否需要额外的转换或数据按摩? 这些加起来,可以认为这样的通用基准。

在32位系统上,浮点数应该更快,但是对代码进行剖析以确保优化是正确的。

我一直认为无论是浮点还是双精度,处理器都是优化的或相同的。 在我的密集型计算中search优化(从matrix中获取大量数据,比较两个值),我发现浮点运算速度提高了13%左右。

这令我感到惊讶,但我想这是由于我的问题的性质。 我不会在操作的核心部分执行float和double操作,而我的计算主要是加法,乘法和减法。

这是我的i7 920,运行一个64位操作系统。