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

在C#中双倍比浮点数快吗?,c#,performance,floating-point,precision,C#,Performance,Floating Point,Precision,我正在编写一个应用程序,它读取大量浮点数组,并对它们执行一些简单的操作。我使用浮点数,因为我认为它会比双倍点数快,但在做了一些研究之后,我发现关于这个主题有一些困惑。有人能详细说明一下吗?这表明浮点数略快于双倍点数: 一般来说,在对性能进行比较时,应该考虑任何特殊情况,例如使用一种类型是否需要额外的转换或数据处理?这些加起来可能会掩盖这样的通用基准测试。在32位系统上,浮点应该更快,但要分析代码以确保您优化了正确的东西。简短的回答是,“使用可接受结果所需的精度。” 一个保证是对浮点数据执行的操作

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

这表明浮点数略快于双倍点数:


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

在32位系统上,浮点应该更快,但要分析代码以确保您优化了正确的东西。

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

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

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

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

  • 除非需要通过double或long double获得额外的精度,否则请使用单精度类型(例如float)。精度更高的类型会增加内存大小和带宽要求。
  • 避免混合数据类型的算术表达式
最后一点很重要,因为这会产生JIT代码,要求x87在操作之间放弃其80位中间格式


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

< P>如果加载和存储操作是瓶颈,那么浮动会更快,因为它们更小。如果要在加载和存储之间进行大量计算,则应大致相等


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

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


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

对于387 FPU算法,对于某些长迭代运算(如pow、log等),浮点运算只比双精度运算快(且仅当编译器正确设置FPU控制字时)


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

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


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

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

这是我的I7 920,运行一个64位的操作系统。< /P> < P>我刚刚读了“微软.NETFramework应用开发基础第二”,用于MCT考试75-536,还有一个注释在第4页(第1章):

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

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

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

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

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

以下是我的尺寸:

(我做了一个“算法”,重复了10000000次,然后重复了300次,从中我得到了一个平均值。)


@Steven A.Lowe:我会注意到一些32位系统内部缺少32位浮点数!因此,整体性能下降。从内存带宽的角度来看,你的说法是正确的,因为浮点数比双精度更合适。我不知道
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