9

我正在编写游戏并想使用数组来表示棋盘。我正在寻找效率,因为我要进行多次迭代。在这种情况下,int 数组或 char 数组对于棋盘表示来说似乎都很方便。在 int 数组和 char 数组中进行操作时,效率方面有什么区别吗?

我怀疑由于 char 数组的每个元素的大小为 1 字节,它可能会因为内存中的不同表示而变慢(考虑一台现代计算机,它至少有 32 位用于 int 表示)......我对吗?

提前致谢。

编辑:我要生成游戏树,这就是为什么效率如此重要,时间消耗的微小差异会产生巨大的差异。

4

3 回答 3

8

对于哪个 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

然后,您可以对其进行概要分析并随时更改它。

于 2012-05-20T05:28:40.973 回答
5

chars 一般是 1 字节对齐的,ints 一般是 4 字节对齐的。假设您正在使用遵循此标准的机器,两个数组都将其内容存储为连续的内存块(int数组大小是数组大小的 4 倍char)。因此,就它们如何利用一块分配的内存而言,任何一个都不太可能有任何不同。

话虽如此,即使底层内存表示不同,我怀疑它会影响程序的吞吐量。

于 2012-05-20T02:04:57.783 回答
4

试试看。使用 gcc 的 -S 标志来获取汇编代码:

gcc -Wall -S code.c -o code.s

看看生成的代码长度是否有明显差异。这不一定是全部,因为您需要了解汇编程序才能判断差异。但它可能会给你一个提示 - 可能 int 和 char 将大致相同。

请注意,如果您混合类型,您几乎肯定会使用 char 数组获得稍慢的代码。因此,如果您将数据存储在 char 数组中,然后以某种方式使用 int 类型“处理”它,那么每次在两者之间进行转换时,您可能会获得额外的指令。用 -S 试试。

于 2012-05-20T04:02:43.133 回答