一倍的速度比漂浮在C#?
-
03-07-2019 - |
题
我正在写一个应用程序,它读大阵列的浮筒和执行一些简单的操作。我用漂浮,因为我认为它会比快一倍,但后做了一些研究我们发现,有一些混淆有关这一主题。任何人都可以详细阐述这个吗?
解决方案
简短的回答是,"使用任何精确是必需为可接受的结果。"
你一个保证是,上执行的操作浮点的数据是完成至少最高的精密部件的表达。所以乘两个 漂浮's完成至少与精密的 漂浮, 和乘 漂浮 和一个 双 会做至少双倍的精确度。该标准指出,"[浮点]操作可以更高的精度于结果类型的操作。"
鉴于JIT。净试图离开你的浮点运作的精确要求,我们可以看看文件从英特尔对于加快我们的行动。在英特尔的平台您的漂浮点运算可以做一个中间精度为80位,并向下转换为精密的要求。
从英特尔的指南C++浮点运算1 (抱歉只有死树),他们提及:
- 用单一精准类型(例如,浮)除非额外的精确度获得通过双重或长期的双重需要。更加精确类型的增加存储器的尺寸和带宽的需求。...
- 避免的混合数据的类型的运算的表情
最后一点是重要的,因为 你可以慢自己下不必要的转换,从浮动和双, ,其结果在JIT会的代码,其中要求x87投离其80位中间格式之间的作业!
1.是的,它说,C++,但是C#标准加上知识的CLR让我们知道的信息C++应适用在这个实例。
其他提示
我刚刚阅读了“Microsoft .NET Framework-Application Development Foundation 2nd”。对于MCTS考试70-536,第4页(第1章)有一个注释:
注意使用内置类型优化性能
运行时优化了32位整数类型(Int32和UInt32)的性能,因此将这些类型用于计数器和其他经常访问的整数变量。对于浮点运算,Double是最有效的类型,因为这些操作是由硬件优化的。
由Tony Northrup撰写。我不知道他是否是一个权威,但我希望.NET考试的官方书籍应该有一些权重。这当然不是一个保证。我只是想把它添加到这个讨论中。
当前的英特尔CPU在80位宽的寄存器中执行所有浮点运算,因此实际的计算速度不应在浮点数和双精度数之间变化。
如果加载&商店运营是瓶颈,然后花车会更快,因为它们更小。如果你在加载和存储之间进行了大量的计算,它应该大致相等。
其他人提到避免浮动和放大之间的转换double,以及使用这两种类型的操作数的计算。这是一个很好的建议,如果你使用任何返回双精度的数学库函数(例如),那么将所有内容保持为双精度将会更快。
我正在编写一个光线跟踪器,并为我的Color类替换浮点数加倍,这给了我5%的加速。用双打替换向量浮动的速度再快5%!非常酷:))
这是Core i7 920
使用387 FPU算法,浮点只比某些长时间的迭代操作(如pow,log等)快两倍(并且只有当编译器正确设置FPU控制字时才会这样)。
使用压缩SSE算法,但它会产生很大的不同。
你错了。在现代处理器中,32位比16位效率更高......也许不是内存方面的,但在有效性方面,32位是可行的方法。
你真的应该将你的教授更新为更新的“最新”。 ;)
无论如何,要回答这个问题; float和double具有完全相同的性能,至少在我的Intel i7 870上(如理论上)。
以下是我的测量结果:
(我做了一个“算法”,我重复了10,000,000次,然后重复了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
这表明花车的速度略快于双打: http://www.herongyang.com /cs_b/performance.html
通常,只要您对性能进行比较,就应该考虑任何特殊情况,例如使用一种类型需要额外的转换或数据按摩吗?这些加起来并且可以相信这样的通用基准。
在32位系统上浮动应该更快,但是要对代码进行分析以确保您正在优化正确的事情。
我一直认为无论是浮点还是双倍,处理器都经过优化或相同。在我的密集计算中搜索优化(从矩阵中获取大量内容,比较两个值),我发现浮点数的运行速度提高了大约13%。
这令我感到惊讶,但我想这是由于我的问题的本质。我不会在操作的核心中执行float和double之间的转换,我的计算主要是添加,乘法和减法。
这是在我的i7 920上,运行64位操作系统。