c++ - 内置类型 : char vs short vs int vs. float 与 double 的性能

标签 c++ c performance built-in

这似乎是一个有点愚蠢的问题,但看到 Alexandre C 的 reply在另一个主题中,我很想知道内置类型是否有任何性能差异:

char vs short vs int vs. float vs. double.



通常我们在现实生活中的项目中不会考虑这种性能差异(如果有的话),但我想知道这是出于教育目的。可以问的一般问题是:
  • 积分算术和浮点算术之间有什么性能差异吗?
  • 哪个更快?更快的原因是什么?请解释一下。
  • 最佳答案

    浮点与整数:

    从历史上看,浮点运算可能比整数运算慢得多。在现代计算机上,情况不再如此(在某些平台上它会稍微慢一些,但是除非您编写完美的代码并针对每个周期进行优化,否则代码中的其他低效率将淹没差异)。

    在某些有限的处理器上,如高端手机中的处理器,浮点可能比整数慢一些,但它通常在一个数量级(或更好)内,只要有可用的硬件浮点。值得注意的是,随着手机被要求运行越来越多的通用计算工作负载,这一差距正在迅速缩小。

    在非常有限的处理器(便宜的手机和 toastr )上,通常没有浮点硬件,因此需要在软件中模拟浮点运算。这很慢——比整数算术慢几个数量级。

    正如我所说,人们希望他们的手机和其他设备越来越像“真正的计算机”,硬件设计人员正在迅速加强 FPU 以满足这种需求。除非您正在追逐每个最后一个周期,或者您正在为很少或没有浮点支持的非常有限的 CPU 编写代码,否则性能差异对您来说无关紧要。

    不同大小的整数类型:

    通常,CPU 在处理其 native 字大小的整数时速度最快(对 64 位系统有一些警告)。在现代 CPU 上,32 位操作通常比 8 位或 16 位操作快,但是这在架构之间差异很大。另外,请记住,您不能孤立地考虑 CPU 的速度;它是复杂系统的一部分。即使操作 16 位数字比操作 32 位数字慢 2 倍,当您用 16 位数字而不是 32 位数字表示它时,您可以将两倍的数据放入缓存层次结构中。如果这在让所有数据来自缓存而不是频繁缓存未命中之间产生差异,那么更快的内存访问将胜过 CPU 的较慢操作。

    其他注意事项:

    向量化进一步平衡了更窄的类型(float 和 8 位和 16 位整数)——您可以在相同宽度的 vector 中执行更多操作。然而,好的 vector 代码很难编写,所以如果没有大量的细心工作,你就不会获得这种好处。

    为什么会有性能差异?

    CPU上的运算速度快慢实际上只有两个因素:运算的电路复杂度,以及用户对运算速度的要求。

    (在合理范围内)任何操作都可以快速进行,只要芯片设计者愿意在问题上投入足够多的晶体管。但是晶体管是要花钱的(或者更确切地说,使用大量晶体管会使你的芯片更大,这意味着每个晶圆上的芯片更少,产量更低,这会花钱),因此芯片设计人员必须权衡使用哪些操作的复杂度,以及他们根据(感知到的)用户需求来做到这一点。粗略地说,您可能会考虑将操作分为四类:

                     high demand            low demand
    high complexity  FP add, multiply       division
    low complexity   integer add            popcount, hcf
                     boolean ops, shifts
    

    几乎所有 CPU 上的高需求、低复杂性操作都将很快:它们是唾手可得的果实,并赋予每个晶体管最大的用户利益。

    高需求、高复杂性的操作在昂贵的 CPU(如计算机中使用的 CPU)上会很快,因为用户愿意为它们付费。您可能不愿意为您的 toastr 支付额外的 3 美元以获得快速的 FP 乘法,但是,因此廉价的 CPU 会忽略这些指令。

    几乎所有处理器上的低需求、高复杂性操作通常都很慢;只是没有足够的好处来证明成本是合理的。

    如果有人费心考虑,低需求、低复杂性的操作将会很快,否则就不存在。

    进一步阅读:
  • Agner Fog 保持良好 website有很多关于低级性能细节的讨论(并且有非常科学的数据收集方法来支持它)。
  • The Intel® 64 and IA-32 Architectures Optimization Reference Manual (PDF 下载链接位于页面下方)也涵盖了很多这些问题,尽管它专注于一个特定的体系结构系列。
  • 关于c++ - 内置类型 : char vs short vs int vs. float 与 double 的性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5069489/

    相关文章:

    mysql - 如何使我的 SELECT 查询更有效率?

    c++ - SDL 按键

    c++ - 如何使用 OpenSSL 测量 C++ Curl 中的握手时间?

    c++ - win32 程序在 GCC 中编译但不是 G++ HDC 错误

    c - 递归结构和 malloc()

    java - 使用数组而不是缓冲区加载 Android OpenGL ES 2.0 纹理

    javascript - 在计时器中连续访问 cookie 的性能影响

    c++ - ZeroMQ 中的 SUB 订阅者是否像 ROS 中那样具有任何 "callback"机制?

    c++ - 指向列表中元素的指针 VS 元素本身

    c++ - 数组+整数的指针 (C++)