C#中的浮点数比浮点数快吗?
我正在编写一个应用程序,该程序读取大量的float并对其执行一些简单的操作。我使用的是float,因为我认为它比double更快,但是经过一些研究后,我发现这个主题有些混乱。有人可以详细说明吗?
解决方案
这表明浮点数比双精度点快一点:http://www.herongyang.com/cs_b/performance.html
通常,任何时候在性能方面进行比较时,都应考虑任何特殊情况,例如使用一种类型是否需要额外的转换或者数据按摩?这些加起来并可以掩盖像这样的通用基准。
浮点数在32位系统上应该更快,但要分析代码以确保我们在优化正确的东西。
简短的答案是:"使用任何精度才能获得可接受的结果。"
一个保证是,至少在表达式的最高精度成员中对浮点数据执行的操作。因此,两个浮点数的乘积至少要以float的精度完成,而float和double的乘积则至少要以double精度完成。该标准指出"与操作的结果类型相比,[浮点]操作可以以更高的精度执行"。
鉴于.NET的JIT尝试使浮点运算保持所要求的精度,我们可以查看英特尔的文档以加快运算速度。在Intel平台上,浮点运算可能会以80位的中间精度完成,然后转换为要求的精度。
从英特尔的《 C ++浮点操作指南》 1(很抱歉只有一棵枯树),他们提到:
Use a single precision type (for example, float) unless the extra precision obtained through double or long double is required. Greater precision types increase memory size and bandwidth requirements. ... Avoid mixed data type arithmetic expressions
最后一点很重要,因为我们可以使用不必要的对float和double的强制转换来放慢自己的速度,这会导致JIT代码,从而要求x87在两次操作之间转换其80位中间格式!
1.是的,它说的是C ++,但是Cstandard加上CLR的知识使我们知道C ++的信息应在这种情况下适用。
如果加载和存储操作成为瓶颈,那么浮点数会更快,因为它们较小。如果要在装载和存储之间进行大量计算,则该计算应该大致相等。
有人提到避免在float和double之间进行转换,以及避免使用两种类型的操作数进行计算。这是一个很好的建议,如果我们使用任何返回双精度数的数学库函数(例如),则将所有内容都保持为双精度会更快。
几周前,我介绍了一个类似的问题。最重要的是,对于x86硬件,除非变为内存受限或者开始遇到缓存问题,否则浮点数和双倍数的性能没有显着差异。在这种情况下,浮子通常会具有优势,因为它们较小。
当前的Intel CPU在80位宽的寄存器中执行所有浮点运算,因此实际的运算速度不应在浮点数和双精度数之间变化。
使用387 FPU算法,对于某些较长的迭代操作(例如pow,log等)(且仅在编译器适当地设置了FPU控制字的情况下),float仅快于两倍。
使用打包的SSE算法,尽管有很大的不同。
我正在编写一个光线跟踪器,并将Color类的浮点数替换为double值使我的速度提高了5%。用double替换Vector浮点又快了5%!太酷了:)
配备酷睿i7 920
我一直认为处理器是优化的还是相同的,而不管float还是double。在大量计算中搜索优化(从矩阵中获取大量数据,比较两个值),我发现浮点数的运行速度提高了约13%。
这让我感到惊讶,但我想这是由于我的问题的性质所致。我不在运算的核心中进行浮点数和双精度数之间的强制转换,而我的计算主要是加,乘和减。
这是在运行64位操作系统的i7 920上。
我刚刚阅读了MCTS考试70-536的" Microsoft .NET Framework-应用程序开发基础2nd",并且在第4页(第1章)上有一条注释:
NOTE Optimizing performance with built-in types The runtime optimizes the performance of 32-bit integer types (Int32 and UInt32), so use those types for counters and other frequently accessed integral variables. For floating-point operations, Double is the most efficient type because those operations are optimized by hardware.
它是由托尼·诺斯鲁普(Tony Northrup)撰写的。我不知道他是否是权威人士,但是我希望.NET考试的官方书应具有一定的分量。当然不是保证金。我只是想将其添加到此讨论中。