我正在编写一个应用程序,它读取大型浮点数并使用它们执行一些简单的操作.我正在使用花车,因为我认为它比双打快,但经过一些研究后我发现这个主题有些混乱.任何人都可以详细说明这个吗?
简短的回答是,"使用可接受结果所需的精度."
您的一个保证是,对浮点数据执行的操作至少在表达式的最高精度成员中完成.因此,将浮点数乘以至少浮点数的精度,并且浮点数和双精度乘以至少双精度.该标准规定"[浮点]操作可以以比操作的结果类型更高的精度执行."
鉴于JIT for .NET试图以所要求的精度离开您的浮点运算,我们可以查看英特尔的文档,以加快我们的运营速度.在Intel平台上,您的浮点运算可以以80位的中间精度完成,并转换为所请求的精度.
从英特尔的C++浮点运算指南1(抱歉只有死树),他们提到:
使用单精度类型(例如,float),除非需要通过double或long double获得的额外精度.更高精度类型会增加内存大小和带宽要求....
避免混合数据类型算术表达式
最后一点非常重要,因为你可以通过浮动和双精度的不必要的强制转换来减慢自己的速度,从而导致JIT代码请求x87在操作之间抛弃其80位中间格式!
1.是的,它说的是C++,但是C#标准加上CLR的知识让我们知道C++的信息应该适用于这个实例.
我刚刚阅读了MCTS考试70-536的"Microsoft .NET Framework-Application Development Foundation 2nd",第4页(第1章)有一个注释:
注意使用内置类型
优化性能运行时优化32位整数类型(Int32和UInt32)的性能,因此将这些类型用于计数器和其他经常访问的整数变量.对于浮点运算,Double是最有效的类型,因为这些操作是由硬件优化的.
它由Tony Northrup编写.我不知道他是否是一个权威,但我希望.NET考试的官方书籍应该有一些权重.这当然不是一个保证.我只是想把它添加到这个讨论中.
我几周前发了一个类似的问题.最重要的是,对于x86硬件,浮点数与双打的性能没有显着差异,除非你成为内存绑定,或者你开始遇到缓存问题.在这种情况下,浮子通常具有优势,因为它们更小.
当前的Intel CPU在80位宽的寄存器中执行所有浮点运算,因此实际的计算速度不应在浮点数和双精度数之间变化.
如果加载和存储操作是瓶颈,那么浮动将更快,因为它们更小.如果你在加载和存储之间进行了大量的计算,它应该大致相等.
其他人提到避免float和double之间的转换,以及使用这两种类型的操作数的计算.这是一个很好的建议,如果你使用任何返回双精度的数学库函数(例如),那么将所有内容保持为双精度将会更快.
我正在编写一个光线跟踪器,并为我的Color类替换浮动双打,这给了我5%的加速.用双打替换向量浮动的速度再快5%!很酷:)
那是Core i7 920