我正在编写一个游戏,想用数组来表示一个棋盘。我正在寻找效率,因为我将进行多次迭代。在这种情况下,int 数组或 char 数组对于电路板表示似乎都很方便。在 int 数组和 char 数组中进行操作时,效率方面有什么区别吗?
我怀疑由于 char 数组的每个元素的大小为 1 字节,它可能由于内存中的表示不同而变慢(考虑一台至少有 32 位用于 int 表示的现代计算机(......我说的对吗?
提前谢谢。
编辑:我将生成游戏树,这就是为什么效率如此重要,时间消耗的微小差异可以产生巨大的差异。
哪个 CPU/s?
一些CPU不能直接访问比"东西"小的东西,编译器需要生成一个"加载,移位和屏蔽"指令序列来访问单个字节。在这种情况下,使用int
应该会获胜。
某些 CPU 可以毫无问题地访问字节。在这种情况下(如果涉及足够的数据很重要(,问题可能是缓存大小和/或内存带宽;而且(至少对于 80x86(我希望char
会赢,因为每个缓存行中都打包了更多的数据。
适用于哪种算法?
如果你能把 SIMD 扔给它,char
很可能会赢。例如,使用 128 位 SIMD,每条指令可以处理 16 个字节,每条指令可以处理 4(32 位(整数,仅此一项char
就可能快 4 倍。
最好的建议是使用以下内容:
#ifdef USE_INT
typedef int thingy
#else
typedef unsigned char thingy
#endif
然后,您可以随时对其进行分析并进行更改。
char
通常以1 字节对齐,int
s 通常以 4 字节对齐。假设您使用的是遵循此标准的机器,则两个数组都将将其内容存储为连续的内存块(int
数组的大小是char
数组的 4 倍(。因此,在利用分配内存块方面,任何一个都不太可能有任何不同。
话虽如此,即使底层内存表示有任何不同,我怀疑它会影响程序的吞吐量。
试试看。 使用 -S 标志到 gcc 获取汇编代码:
gcc -Wall -S code.c -o code.s
查看生成的代码长度是否有明显差异。 这不一定是全部,因为您需要了解汇编程序来判断差异。 但它可能会给你一个提示 - 可能 int 和 char 会大致相同。
请注意,如果混合使用类型,则几乎肯定会使用字符数组获得稍慢的代码。 因此,如果您将数据存储在 char 数组中,然后使用 int 类型以某种方式"处理"它,则每次在两者之间进行转换时,您可能会得到一条额外的指令。 尝试使用 -S。