比C#中的浮点数快一倍?

时间:2008-10-01 17:58:46

标签: c# performance floating-point precision

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

10 个答案:

答案 0 :(得分:63)

简短的回答是,“使用可接受结果所需的精确度。”

您的一个保证是,对浮点数据执行的操作至少在表达式的最高精度成员中完成。因此,将两个 float 相乘至少使用 float 的精度,并乘以 float double 将以至少双精度完成。该标准规定“[浮点]操作的执行精度可能高于操作的结果类型。”

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

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

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

最后一点非常重要,因为you can slow yourself down with unnecessary casts to/from float and double会导致JIT代码请求x87在操作之间抛弃其80位中间格式!

1。是的,它说的是C ++,但是C#标准加上CLR的知识让我们知道C ++的信息应该适用于这个实例。

答案 1 :(得分:20)

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

  

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

由Tony Northrup撰写。我不知道他是否是一个权威,但我希望.NET考试的官方书籍应该有一些权重。这当然不是一个保证。我只是想把它添加到这个讨论中。

答案 2 :(得分:19)

几周前,我描述了一个类似的问题。最重要的是,对于x86硬件,浮点数与双打的性能没有显着差异,除非你成为内存绑定,或者你开始遇到缓存问题。在这种情况下,花车通常具有优势,因为它们更小。

当前的英特尔CPU在80位宽的寄存器中执行所有浮点运算,因此实际的计算速度不应在浮点数和双精度数之间变化。

答案 3 :(得分:7)

如果加载&商店运营是瓶颈,然后花车会更快,因为它们更小。如果你在加载和存储之间进行了大量的计算,它应该大致相等。

其他人提到避免浮动和放大之间的转换double,以及使用这两种类型的操作数的计算。这是一个很好的建议,如果你使用任何返回双精度的数学库函数(例如),那么将所有内容保持为双精度将会更快。

答案 4 :(得分:7)

我正在编写一个光线跟踪器,并为我的Color类替换浮点数加倍,这给了我5%的加速。用双打替换向量浮动的速度再快5%!非常酷:))

这是Core i7 920

答案 5 :(得分:4)

使用387 FPU算法,浮点只比某些长时间的迭代操作(如pow,log等)快两倍(并且只有在编译器正确设置FPU控制字时才会这样)。

使用压缩SSE算法,但它会产生很大的不同。

答案 6 :(得分:3)

Matthijs,

你错了。在现代处理器中,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

答案 7 :(得分:1)

这表明花车比双打要快一些:http://www.herongyang.com/cs_b/performance.html

通常,只要您对性能进行比较,就应该考虑任何特殊情况,例如使用一种类型需要额外的转换或数据按摩吗?这些加起来并且可以相信这样的通用基准。

答案 8 :(得分:1)

在32位系统上浮动应该更快,但是要对代码进行分析以确保您正在优化正确的事情。

答案 9 :(得分:1)

我一直认为无论是浮点还是双倍,处理器都经过优化或相同。在我的密集计算中搜索优化(从矩阵中获取大量内容,比较两个值),我发现浮点数的运行速度提高了大约13%。

这令我感到惊讶,但我想这是由于我的问题的本质。我不会在操作的核心中执行float和double之间的转换,我的计算主要是添加,乘法和减法。

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