我正在对算法进行基准测试,没有必要知道细节。主要组件是缓冲区(整数的原始数组)和索引器(整数 - 用于访问缓冲区中的元素)。
缓冲区的最快类型似乎是unsigned char,以及short,int,long的有符号和无符号版本。但是char / signed char更慢。差异:1.07x。
对于索引器,有符号和无符号类型之间没有区别。然而,int和long比char和short快1.21倍。
在考虑性能而非内存消耗时,是否应该默认使用某种类型?
注意:缓冲区元素和索引器上使用的操作是赋值,递增,递减和比较。
答案 0 :(得分:7)
一般来说,最大的胜利来自缓存。
如果您的数据值足够小以至于它们符合8位,那么您可以在CPU缓存中容纳比使用整数和浪费3个字节/值时更多的数据。如果您正在处理数据块,则可以获得缓存命中的巨大速度优势。
索引的类型不太重要,只要它适合CPU寄存器(即不要在8位CPU上使用long long
)它将具有相同的速度
编辑:还值得一提的是测量速度很棘手。您需要多次运行算法以允许缓存,您需要查看CPU上正在运行的其他内容,甚至是其他硬件可能正在中断的内容。除非您非常小心,否则10%的速度差异可能被视为噪音。
答案 1 :(得分:2)
这在很大程度上取决于底层架构。通常,最快的数据类型是字宽的数据类型。根据我对IA32(x86-32)的经验,小于/大于字数据类型会导致惩罚,有时甚至会为一个数据读取多个内存。
一旦进入CPU寄存器,通常数据类型长度无关紧要(如果整个数据适合一个寄存器,那就是),但是用它们完成了哪些操作。当然浮点运算成本最高;最快的是添加,减法(也是比较),逐位(移位等)和逻辑运算(和,或......)。
答案 2 :(得分:1)
没有关于哪种类型更快或更慢的承诺。 int
应该代表机器的自然字长,无论这意味着什么,所以它可能会更快。或者更慢,取决于其他因素。
答案 3 :(得分:0)
以下是基本积分类型或扩展积分类型的typedef。
检查快速mod。 你也可以找到其他类型(char)的快速模型。
library is :: cstdint
uint_fast8_t ::我的建议
http://www.cplusplus.com/reference/cstdint/
??你可能需要了解你正在使用的机器的架构!!
答案 4 :(得分:-1)
据说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
也可能相同。
所以最快的整数类型是长度与机器字相同的类型。如果使用尺寸小于机器字的类型,程序将运行得更慢。