我正在写一个应用程序,它读取的花车大阵列,并与他们进行了一些简单的操作。 我使用花车,因为我认为这会是增加了一倍快,但做了一些研究之后,我发现有关于这个话题有些混乱。 谁能解释一下?
Answer 1:
简短的回答是,“需要可接受的结果无论使用哪精度。”
你的一个保证就是操作上的浮点数据,至少在表达的精度最高的成员进行执行。 所以乘两条浮法的与浮动的至少精度完成,并且浮动乘以双将与至少双精度来完成。 该标准规定,“浮点]操作可以以比的结果类型的操作的精确度更高的执行。”
由于面向.NET的JIT试图离开你的浮点运算所要求的精度,我们可以看一看文档英特尔加快我们的业务。 在Intel平台上的浮点运算可以在80位的中间精密度来完成,并转换到所要求的精度。
从英特尔的指导C ++浮点运算1(抱歉,只有死树),他们提到:
- 使用一个单精度类型(例如,浮动)除非需要通过双或双长所获得的额外的精度。 更精确的类型增加内存容量和带宽需求。 ...
- 避免混合数据类型的算术表达式
最后一点很重要,因为你可以慢下来自己与float和double不必要的强制类型/ ,这导致其要求的x87投从80位中间格式客场操作之间的这些JIT过的代码!
是的,它说C ++,但CLR的C#标准加上知识让我们知道C ++中的信息应该是适用于本实例。
Answer 2:
我刚才读了“微软.NET Framework的应用程序开发基础2号”的MCTS考试70-536且有4页(第1章)上的说明:
注:与内建类型优化性能
运行时优化的32位整数类型(的Int32和UInt32的)的性能,所以使用这些类型为柜台等频繁存取的积分的变量。 对于浮点运算,双是最有效的类型,因为这些操作都是由硬件进行了优化。
它是由Tony Northrup公司写的。 我不知道,如果他是一个权威或没有,但我希望,对于.NET考试官书应随身携带一些重量。 这当然不是一个gaurantee的。 我只是觉得应该把它添加到这个讨论。
Answer 3:
我异形一个类似的问题在几个星期前。 底线是,x86硬件,存在浮动的性能没有显著差异对双打,除非你成为记忆的约束,或者你开始运行到缓存的问题。 在这种情况下,彩车将一般具有优势,因为它们比较小。
目前英特尔CPU执行80位宽的寄存器中的所有浮点运算,因此计算的实际速度不应该和双精度浮点数之间变化。
Answer 4:
如果负载和存储操作的瓶颈,然后花车会更快,因为他们是小。 如果你正在做的载入和存储之间计算的显著数量,它应该差不多相等。
别人提到避免浮动和双,并同时使用两种类型的操作数计算之间转换。 这是很好的建议,如果你使用任何数学库函数返回双打(例如),则保持原有的一切作为双打会更快。
Answer 5:
我正在写一个光线追踪,并与双打我的Color类代替彩车给了我5%的速度提升。 更换载体花车与双打是另一个快5%! 很酷的:)
这是与酷睿i7 920
Answer 6:
用387 FPU算术,浮子仅比双更快某些长迭代操作等POW,日志等(且仅当该编译器将FPU控制字恰当地)。
随着填充SSE运算,它使一个很大的区别,但。
Answer 7:
Matthijs,
你错了。 32位远远高于16位的更有效的 - 在现代的处理器...也许不是记忆明智的,但在效力32位是要走的路。
你真的应该更新你的教授到更多的东西“上的最新”。 ;)
总之,要回答这个问题; float和double具有完全相同的性能,至少在我的英特尔酷睿i7 870(在理论上)。
这里是我的测试:
(I制成的“算法”,我重复千万次,然后重复,对于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
Answer 8:
这表明,彩车比双打略快: http://www.herongyang.com/cs_b/performance.html
在一般情况下,你做对性能有比较任何时候,你应该考虑任何特殊情况下,如不使用一种类型的需要额外的转换或数据按摩? 这些加起来,可以掩盖通用基准这样。
Answer 9:
花车应该是一个32位系统上速度较快,但配置文件中的代码,以确保您优化了正确的事情。
Answer 10:
我一直认为的处理器进行了优化,或者相同的,无论float或double。 搜索我的密集型计算优化(很多从矩阵得到的,两个数值的比较)我发现彩车运行约13%的速度。
这让我很吃惊,但我想这是因为我的问题的性质。 我不这样做float和double之间铸件在操作的核心,我的计算主要是加,乘和减法。
这是对我的i7 920,运行64位操作系统。