在最有效的类型第二个here
下...当定义一个存储浮点数的对象时,使用double类型,... double类型比float类型效率低两到三倍......
似乎它自相矛盾?
我读到其他地方(不记得在哪里)涉及整数的计算比许多机器上的短路更快,因为它们被转换为整数以执行操作?这是真的?关于这个的任何链接?
答案 0 :(得分:5)
人们总是可以争论您链接到的网站上的内容质量。但你引用的两个引用是:
...并且在定义存储浮点数的对象时,请使用double类型,...
和
... double类型的效率比float类型低两到三倍......
参考两个不同的东西,第一个暗示使用双精度会由于精度提高而提供更少的问题,而另一个提到性能。但老实说,我不会过分关注这一点,如果你的代码执行不理想,可能是由于算法选择不正确而不是错误选择原始数据类型。
以下是关于我的一位老教师的单精度浮标和双精度浮标的性能比较的引用:Agner Fog在他的网站上有很多有趣的读物:http://www.agner.org关于软件优化,如果你是真的对微观优化很感兴趣看看它:
在大多数情况下,双精度计算不会花费比单精度更多的时间。当使用浮点寄存器时,单精度和双精度之间的速度没有差别。长双精度只需要稍微多一点的时间。当使用XMM寄存器时,单精度除法,平方根和数学函数的计算速度比双精度快,而加法,减法,乘法等的速度仍然相同,无论大多数处理器的精度如何(当向量运算不是时)使用)。
来源: http://agner.org/optimize/optimizing_cpp.pdf
虽然不同的编译器和不同的处理器可能会有不同的变化,但是应该从中吸取教训,很可能你不需要担心这个级别的优化,看看算法的选择,甚至是数据容器,而不是原始数据类型。
答案 1 :(得分:4)
除非您正在编写用于航天飞机发射的软件(最近一直没有做得太好),否则这些优化可以忽略不计。 正确的代码远比 fast 代码重要。如果您需要精度,使用双精度几乎不会影响运行时间。
影响执行时间的方式不仅仅是类型定义:
复杂性 - 要做的工作越多,代码的运行速度就越慢。减少所需的工作量,或将其分解为更小,更快的任务。
重复 - 通常可以避免重复,并且不可避免地会破坏代码性能。它有许多伪装 - 例如,无法缓存昂贵计算或远程过程调用的结果。每次重新计算时,都会浪费效率。它们还扩展了可执行文件的大小。
糟糕的设计 - 自我解释。在编码之前先想想!
I / O - 执行被阻止等待输入或输出(进出用户,磁盘或网络连接)的程序必然会严重执行。< / p>
还有很多原因,但这些是最大的原因。就个人而言,糟糕的设计是我见过的大部分时间。状态机可能是无状态的,动态分配静态就好了,等等都是真正的问题。
答案 2 :(得分:4)
根据硬件的不同,实际的CPU(或FPU,如果你愿意)double
的性能介于现代CPU的速度的一半和相同的速度之间[例如,加或减可能是相同的速度,乘以或与float
相比,较大类型的除法可能不同。
除此之外,“每个缓存行数量更少”,因此如果存在大量缓存行,则由于内存速度较慢,速度会变慢。每个缓存行,double
个值的一半 - &gt;如果应用程序完全受内存限制,大约一半的性能。它在CPU绑定应用程序中的影响要小得多。
同样,如果使用SSE或类似的SIMD技术,double
将占用两倍的空间,因此实际计算的数量是“每条指令”的一半,通常,CPU将对于float
和double
,每个周期允许相同数量的指令 - 除了double
需要更长时间的某些操作。再次,导致大约一半的性能。
所以,是的,我认为链接中的页面令人困惑,混淆了double
和float
之间的理想性能设置。也就是说,从纯粹的性能角度来看。使用float
时出现明显的计算错误通常要容易得多 - 这可能很难追踪 - 所以从double
开始,如果认为有必要,请切换到float
因为你有将其确定为性能问题(无论是经验还是测量)。
是的,有几种架构只存在一个大小的整数 - 或者只有两种大小,例如8位char
和32位int
,以及16位{{1}将通过执行32位数学运算来模拟,然后删除值的顶部。例如MIPS只有32位操作,但可以存储16位值并将其加载到内存中。它并不一定会让它变慢,但它肯定意味着它“不会更快”。