代码之家  ›  专栏  ›  技术社区  ›  Trap

在C#中双倍比浮点数快吗?

  •  53
  • Trap  · 技术社区  · 16 年前

    我正在编写一个应用程序,它读取大量浮点数组,并对它们执行一些简单的操作。我使用浮点数,因为我认为它会比双倍点数快,但在做了一些研究之后,我发现关于这个主题有一些困惑。有人能详细说明一下吗?

    10 回复  |  直到 7 年前
        1
  •  63
  •   Peter Mortensen icecrime    7 年前

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

    一个保证是对浮点数据执行的操作至少在表达式的最高精度成员中完成。所以乘以2 浮动 浮动 ,并乘以a 将以至少两倍的精度完成。该标准规定“[浮点]运算的执行精度可能高于运算的结果类型。”

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

    从英特尔指南到C++浮点运算 1.

    • ...
    • 避免混合数据类型的算术表达式

    最后一点同样重要 you can slow yourself down with unnecessary casts to/from float and double ,这导致JIT代码要求x87在操作之间放弃其80位中间格式!

    1.是的,它表示C++,但是C语言标准加上CLR的知识让我们知道C++中的信息应该适用于这个例子。

        2
  •  21
  •   Matthijs Wessels    14 年前

    我刚刚阅读了《MCSS考试75-536》的“微软.NETFramework应用程序开发基础第二”,第4页(第1章)有一个注释:


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

    这是托尼·诺斯鲁普写的。我不知道他是否是权威,但我认为.NET考试的官方书籍应该有一定的分量。这当然不是一个高兰蒂。我只是想把它加入讨论。

        3
  •  19
  •   Dave Tarkowski    16 年前

    几周前,我提出了一个类似的问题。底线是,对于x86硬件,浮点与双倍的性能没有显著差异,除非内存受限,或者开始遇到缓存问题。在这种情况下,浮动通常具有优势,因为它们较小。

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

        4
  •  7
  •   Mark Bessey    16 年前

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

        5
  •  7
  •   ratdogg ratdogg    16 年前

    我正在编写一个光线跟踪器,将颜色类中的浮动替换为双浮动,可以使我的速度提高5%。将矢量浮动替换为双精度浮动又快了5%!很酷:)

    它的核心是i7920

        6
  •  4
  •   Dark Shikari    16 年前

    对于387 FPU算法,对于某些长迭代操作,如pow、log等,浮点运算的速度仅比double快(并且只有在编译器适当设置FPU控制字的情况下)。

        7
  •  3
  •   Peter Mortensen icecrime    7 年前

    Matthijs,

    你错了。在现代处理器中,32位的效率远远高于16位。。。也许不是内存方面的问题,但在有效性方面,32位是最好的选择。

    你真的应该让你的教授更新到更“最新”的东西

    无论如何,回答这个问题;float和double具有完全相同的性能,至少在我的英特尔i7 870上是如此(理论上)。

    以下是我的尺寸:

    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
    
        8
  •  2
  •   Peter Mortensen icecrime    7 年前

    我一直认为,无论是浮点还是双精度,处理器都是经过优化或相同的。在我密集的计算中寻找优化(从一个矩阵中获取大量数据,比较两个值),我发现浮点运算速度快了13%。

    这让我很惊讶,但我想这是因为我的问题的本质。在运算的核心部分,我不会在float和double之间进行转换,我的计算主要是加法、乘法和减法。

        9
  •  1
  •   torial    16 年前

    这表明浮点数略快于双倍点数: http://www.herongyang.com/cs_b/performance.html

    一般来说,在对性能进行比较时,应该考虑任何特殊情况,例如使用一种类型是否需要额外的转换或数据处理?这些加起来可以掩盖像这样的通用基准。

        10
  •  1
  •   Peter Mortensen icecrime    7 年前

    在32位系统上,浮点运算应该更快,但要对代码进行分析,以确保优化的内容正确。