[英]C++ - the fastest integer type?
我一直在对算法进行基准测试,没有必要知道细节。 主要组件是缓冲区(原始整数数组)和索引器(整数 - 用于访问缓冲区中的元素)。
缓冲区最快的类型似乎是 unsigned char,以及 short、int、long 的有符号和无符号版本。 但是 char/signed char 速度较慢。 差异:1.07 倍。
对于索引器,有符号和无符号类型之间没有区别。 然而,int 和 long 比 char 和 short 快 1.21 倍。
在考虑性能而不是 memory 消耗时,是否应该默认使用一种类型?
注意:用于缓冲区和索引器元素的操作是赋值、递增、递减和比较。
通常最大的胜利来自缓存。
如果您的数据值足够小,可以容纳 8 位,那么与使用 int 并浪费 3 个字节/值相比,您可以在 CPU 缓存中容纳更多数据。 如果您正在处理一个数据块,您将在高速缓存命中方面获得巨大的速度优势。
索引的类型不太重要,只要它适合 CPU 寄存器(即不要尝试在 8 位 CPU 上使用long long
),它就会有相同的速度
编辑:还值得一提的是,测量速度很棘手。 您需要多次运行该算法以允许缓存,您需要观察 CPU 上还有什么在运行,甚至还有哪些其他硬件可能正在中断。 除非您非常小心,否则 10% 的速度差异可能会被视为噪音。
它在很大程度上取决于底层架构。 通常最快的数据类型是那些字宽的。 根据我使用 IA32 (x86-32) 的经验,小于/大于 word 数据类型会导致惩罚,有时甚至超过一次 memory 读取一个数据。
一旦进入 CPU 寄存器,通常数据类型长度并不重要(如果整个数据适合一个寄存器,也就是说),而是您用它们完成的操作。 当然浮点运算是最昂贵的; 最快的是加法、减法(也是比较)、按位(移位等)和逻辑运算(和、或...)。
没有关于哪种类型更快或更慢的承诺。 int
应该代表机器的自然字长,不管它是什么意思,所以它可能 go 更快。 或更慢,取决于其他因素。
以下是基本整数类型或扩展整数类型的 typedef。
检查快速模式。 您也可以找到其他类型(字符)的快速模组。
图书馆是:: cstdint
uint_fast8_t:: 我的建议
http://www.cplusplus.com/reference/cstdint/
??您可能需要了解您正在使用的机器的体系结构!!
正如所说, int
在大多数情况下代表机器字。 因此int
将具有与处理器寄存器相同的长度,因此不会执行任何其他操作来将int
放入寄存器而不是返回 RAM。
如果您使用char
,它比int
小 4 倍(在 x86 系统上),也比处理器寄存器小 4 倍。 所以在将它放入 RAM 之前,它应该被截断。 结果使用了更多的时间。
此外,具有 32 位寄存器的处理器无法执行 8 位数字的操作。 如果将 char 添加到 char,则它们都将被注册。 所以每个寄存器将有 8 位的 char 值和 24 位的垃圾。 将添加两个 32 位值,然后结果将被截断为 8 位。 char
和short
同时工作的原因是使用了相同数量的附加操作。 而对于int
额外的操作没有完成。
我想补充一点,处理器int
和unsigned int
完全相同,因为它以相同的方式对待它们。 对于某些编译器, int
和long int
也可能相同。
所以最快的 integer 类型是长度与机器字相同的类型。 如果您使用比机器字更小的类型,程序将运行得更慢。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.