【问题标题】:Efficiency: char array vs int array效率:char 数组 vs int 数组
【发布时间】:2012-05-27 01:34:54
【问题描述】:

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

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

提前致谢。

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

【问题讨论】:

  • 我想不出任何理由 char 会变慢。如果有的话,可能取决于您正在执行的操作,它可能会更快。在 8 位架构的嵌入式目标上,int 操作会更慢。
  • 也许可以,但是char 数组占用的内存更少,如果它有足够的元素,它可能会比int 数组更快。

标签: c arrays string malloc data-representation


【解决方案1】:

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

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

【讨论】:

  • 嘿 - 这很尴尬 - 现在已修复。谢谢:-)
【解决方案2】:

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

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

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

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

【讨论】:

  • +1!这将是证实这些断言的明确证据。两个很好的答案,可惜我只能选择一个。
【解决方案3】:

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

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

【讨论】:

  • 我同意第一句话,但这是否意味着 int 表示(在 32 位机器上)将占用 4 倍的内存?是的,这些块是连续的,但大小不同。
  • 我更新了我的答案以澄清这一点(我认为读者会明白这一点,但也许我应该更明确一点)。
  • 我认为让我印象深刻的一句话是“就总内存利用率而言,两者都不太可能有任何不同”。 -- 就总内存利用率而言,它们会有所不同,一个是另一个大小的 4 倍。
  • 啊,好的,我现在明白了。抱歉,我试图描述变量如何利用调用malloc 返回的分配内存块。即“假设机器遵循此标准(并假设您使用的是malloc 的合理实现),几乎可以肯定不会有内部碎片”。至少是这样的,很抱歉造成混乱。
  • 如果对两种类型使用相同数量的数组元素,则 char 数组将使用 1/4 的空间。在某些处理器上,使用 char 数组会稍微快一些;在其他人身上, int 数组会稍微快一些。如果对两种类型使用相同数量的字节(意味着一个使用 1/4 的 int 数组元素数量),则不需要打包和解包的操作可能会在任一类型的每个数组元素上花费相同的时间(意味着“int”可能快四倍)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-12-09
  • 1970-01-01
  • 1970-01-01
  • 2011-11-09
相关资源
最近更新 更多