为了账号安全,请及时绑定邮箱和手机立即绑定

内置类型的性能:char vs short vs int vs. float vs. double

内置类型的性能:char vs short vs int vs. float vs. double

C++
12345678_0001 2019-08-06 17:39:44
内置类型的性能:char vs short vs int vs. float vs. double这可能看起来有点愚蠢但是看到Alexandre C 在其他主题中的回复,我很想知道如果内置类型有任何性能差异:charVS shortVS int主场迎战float 主场迎战double。通常我们在现实生活中没有考虑这种性能差异(如果有的话),但我想知道这是出于教育目的。可以问的一般问题是:整数算术和浮点运算之间是否有任何性能差异?哪个更快?更快的原因是什么?请解释一下。
查看完整描述

3 回答

?
哔哔one

TA贡献1854条经验 获得超8个赞

绝对。

首先,当然,它完全取决于所讨论的CPU架构。

但是,积分和浮点类型的处理方式非常不同,因此以下情况几乎总是如此:

  • 对于简单的操作,积分类型很快。例如,整数加法通常只有一个周期的延迟,整数乘法通常约为2-4个周期,即IIRC。

  • 浮点类型用于执行速度慢得多。然而,在今天的CPU上,它们具有出色的吞吐量,并且每个浮点单元通常可以在每个周期中退出操作,从而导致与整数运算相同(或类似)的吞吐量。但是,延迟通常更糟。浮点加法通常具有大约4个周期的延迟(对于整数而言为1)。

  • 对于一些复杂的操作,情况是不同的,甚至是逆转的。例如,对FP的划分可能具有比整数更少的延迟,这仅仅是因为在两种情况下操作都很复杂,但它在FP值上更常用,因此可以花费更多精力(和晶体管)来优化该情况。

在某些CPU上,双精度可能比浮点数慢得多。在某些体系结构中,没有用于双精度的专用硬件,因此它们通过传递两个浮点大小的块来处理,从而使您的吞吐量更低,延迟时间延长两倍。在其他(例如x86 FPU)上,两种类型都转换为相同的内部格式80位浮点(在x86的情况下),因此性能相同。在其他情况下,float和double都有适当的硬件支持,但由于float具有较少的位,因此可以更快地完成,通常相对于双操作减少一点延迟。

免责声明:所有提及的时间和特征都是从内存中提取的。我看起来没什么,所以可能是错的。;)

对于不同的整数类型,答案根据CPU架构而有很大差异。x86架构由于其悠久的历史,必须本身支持8,16,32(以及今天的64)位操作,并且通常它们都同样快速(它们使用基本相同的硬件,并且只有零根据需要输出高位。

但是,在其他CPU上,小于a的数据类型int加载/存储的成本可能更高(向内存写入一个字节可能必须通过加载它所在的整个32位字来完成,然后进行位屏蔽以更新寄存器中的单个字节,然后将整个字写回)。同样,对于大于的数据类型int,某些CPU可能必须将操作拆分为两个,分别加载/存储/计算下半部分和上半部分。

但是在x86上,答案是它并不重要。由于历史原因,CPU需要对每种数据类型都提供非常强大的支持。因此,您可能注意到的唯一区别是浮点运算具有更多延迟(但吞吐量相似,因此它们本身并不,至少如果您正确编写代码)


查看完整回答
反对 回复 2019-08-06
?
慕无忌1623718

TA贡献1744条经验 获得超4个赞

我认为没有人提到整数推广规则。在标准C / C ++中,不能对小于的类型执行任何操作int。如果char或short恰好小于当前平台上的int,则它们被隐式提升为int(这是bug的主要来源)。编译器需要进行隐式升级,没有违反标准就无法绕过它。

整数提升意味着语言中的操作(加法,按位,逻辑等)不会出现在比int更小的整数类型上。因此,对char / short / int的操作通常同样快,因为前者被提升为后者。

除了整数提升之外,还有“通常的算术转换”,这意味着C努力使两个操作数相同,如果它们不同,则将其中一个转换为两个中较大的一个。

但是,CPU可以在8,16,32等级执行各种加载/存储操作。在8位和16位架构上,这通常意味着尽管有整数提升,但8位和16位类型更快。在32位CPU上,它实际上可能意味着较小的类型较慢,因为它希望将所有内容整齐地排列在32位块中。32位编译器通常优化速度,并在比指定空间更大的空间中分配更小的整数类型。

虽然通常较小的整数类型当然比较大的整数类型占用更少的空间,所以如果你打算优化RAM大小,他们更喜欢。


查看完整回答
反对 回复 2019-08-06
  • 3 回答
  • 0 关注
  • 619 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信