6

我一直在对算法进行基准测试,没有必要知道细节。主要组件是缓冲区(整数的原始数组)和索引器(整数 - 用于访问缓冲区中的元素)。

缓冲区最快的类型似乎是 unsigned char,以及 short、int、long 的有符号和无符号版本。但是 char/signed char 比较慢。差异:1.07 倍。

对于索引器,有符号和无符号类型之间没有区别。然而 int 和 long 比 char 和 short 快 1.21 倍。

在考虑性能而不是内存消耗时,是否应该默认使用一种类型?

注意:对缓冲区元素和索引器使用的操作是赋值、递增、递减和比较。

4

5 回答 5

8

通常最大的胜利来自缓存。

如果您的数据值足够小以至于它们适合 8 位,那么您可以在 CPU 缓存中容纳更多的数据,而不是使用整数并浪费 3 个字节/值。如果你正在处理一个数据块,你会在缓存命中方面获得巨大的速度优势。

索引的类型不太重要,只要它适合 CPU 寄存器(即不要尝试long long在 8 位 CPU 上使用),它就会具有相同的速度

编辑:还值得一提的是,测量速度很棘手。您需要多次运行该算法以允许缓存,您需要查看 CPU 上正在运行的其他内容,甚至还有其他硬件可能正在中断的内容。除非您非常小心,否则 10% 的速度差异可能会被视为噪音。

于 2012-04-04T16:53:51.217 回答
2

它在很大程度上取决于底层架构。通常最快的数据类型是字宽的。根据我对 IA32 (x86-32) 的经验,比字数据类型更小/更大的数据类型会受到惩罚,有时甚至会为一个数据读取超过一个内存。

一旦在 CPU 寄存器上,通常数据类型长度无关紧要(如果整个数据适合一个寄存器,那就是),但你用它们完成什么操作。当然浮点运算是最昂贵的;最快的是加法,减法(这也是比较),逐位(移位等)和逻辑运算(和,或......)。

于 2012-04-04T18:09:31.137 回答
1

没有关于哪种类型更快或更慢的承诺。int应该代表机器的自然字长,不管这可能意味着什么,所以它可能会更快。或者更慢,取决于其他因素。

于 2012-04-04T16:54:49.547 回答
0

以下是基本整数类型或扩展整数类型的 typedef。

检查快速模式。您也可以找到其他类型(字符)的快速 mod。

图书馆是 :: cstdint

uint_fast8_t :: 我的建议

http://www.cplusplus.com/reference/cstdint/

??您可能需要了解您正在使用的机器的架构!

于 2017-05-14T08:59:07.923 回答
-1

正如人们所说int,在大多数情况下代表机器字。因此int将具有与处理器寄存器相同的长度,因此不会执行任何其他操作来将其放入int寄存器并返回到 RAM。

如果你使用char它,它比处理器寄存器小 4 倍(在 x86 系统上)int,也比处理器寄存器小 4 倍。因此,在将其放入 RAM 之前,它应该被截断。结果使用了更多的时间。

此外,具有 32 位寄存器的处理器无法执行 8 位数字的操作。如果将 char 添加到 char 中,则它们都将被注册。所以每个寄存器将有 8 位 char 值和 24 位垃圾。将添加两个 32 位值,然后将结果截断为 8 位。char和同时工作的原因short是使用了相同数量的附加操作。而对于int额外的操作没有做。

我想为处理器添加它,int并且unsigned int与它以相同的方式对待它们完全一样。对于某些编译器intlong int也可能是相同的。

所以最快的整数类型是长度与机器字相同的类型。如果您使用大小小于机器字的类型,则程序运行速度会变慢。

于 2012-04-04T17:06:41.727 回答