内置式效率

Built-in type efficiency

本文关键字:效率 内置      更新时间:2023-10-16

最有效的类型在此处排名第二

当定义一个对象来存储浮点数时,请使用double类型。。。双重型的效率是浮动型的两到三倍。。。

看起来好像自相矛盾?

我在其他地方读到(记不清在哪里),在许多机器上,涉及int的计算比short更快,因为它们被转换为int来执行运算?这是真的吗?有关于这个的链接吗?

当定义一个对象来存储浮点数时,请使用double类型。。。

双重型的效率是浮动型的两到三倍。。。

参考两件不同的事情,第一件暗示使用替身会因为精度的提高而减少很多问题,而另一件则谈到性能。但老实说,我不会太在意这一点,很可能如果你的代码表现不理想,那是由于算法的错误选择,而不是原始数据类型的错误选择。

以下是我的一位老老师Agner Fog关于单精度和双精度浮子性能比较的一句话,他在自己的网站上读了很多有趣的文章:http://www.agner.org关于软件优化,如果你真的对微观优化感兴趣,可以看看:

在大多数情况下,双精度计算所需的时间不超过单精度。当使用浮点寄存器时,单精度和双精度之间的速度根本没有差异

来源:http://agner.org/optimize/optimizing_cpp.pdf

虽然不同的编译器和处理器可能有不同的变体,但我们应该从中吸取的教训是,很可能您不需要担心这一级别的优化,只需考虑算法的选择,甚至是数据容器,而不是原始数据类型。

这些优化可以忽略不计,除非你正在为航天飞机发射编写软件(最近做得不太好)正确的代码比快速的>代码重要得多。如果您需要精度,使用替身几乎不会影响运行时间。

比类型定义更能影响执行时间的东西:

  1. 复杂性-要做的工作越多,代码运行就越慢。减少所需的工作量,或者将其分解为更小、更快的任务。

  2. 重复-重复通常是可以避免的,并且不可避免地会破坏代码性能。它有很多伪装——例如,无法缓存昂贵计算或远程过程调用的结果。每次重新计算都会浪费效率。它们还扩展了可执行文件的大小。

  3. 糟糕的设计-不言自明。编码前先思考!

  4. I/O-执行被阻止等待输入或输出(与用户、磁盘或网络连接之间的输入或输出)的程序注定会执行不良。

原因还有很多,但这些都是最大的。就我个人而言,糟糕的设计是我见过的大多数情况。可能是无状态的状态机,静态的动态分配,等等都是真正的问题。

根据硬件的不同,与float相比,double的实际CPU(或FPU,如果你喜欢的话)性能介于现代CPU的一半速度和相同速度之间[例如,加法或减法可能是相同的速度,乘法或除法对于较大的类型可能不同]。

最重要的是,"每个缓存行更少",所以如果有大量缓存行,它会变得更慢,因为内存速度更慢。每个缓存行有一半的double值,如果应用程序是完全内存绑定的,则大约是性能的一半。在CPU受限的应用程序中,这将是一个小得多的因素。

类似地,如果您使用SSE或类似的SIMD技术,double将占用两倍的空间,因此实际计算的数量是"每条指令"的一半,并且通常情况下,CPU将允许floatdouble每个周期有相同数量的指令,但double需要更长时间的某些操作除外。再次,导致大约一半的性能。

所以,是的,我认为链接中的页面混淆了doublefloat之间的理想性能设置。也就是说,从纯粹的性能角度来看。使用float时,通常更容易出现明显的计算错误,这可能很难追踪,因此从double开始,如果认为有必要,则切换到float,因为您已经将其确定为性能问题(根据经验或测量)。

是的,有几种架构只存在一个大小整数,或者只有两个大小,例如8位char和32位int,以及16位short,可以通过执行32位数学运算来模拟,然后去掉值的顶部。例如,MIPS只有32位操作,但可以将16位值存储并加载到内存中。这并不一定会使它变慢,但它肯定意味着它"不快"。