代码之家  ›  专栏  ›  技术社区  ›  flashnik

位操作是否会导致程序运行较慢?

  •  5
  • flashnik  · 技术社区  · 16 年前

    我正在处理一个需要处理大量数据的问题。当前其值表示为 unsigned int . 我知道实际值不超过 1000 .

    问题

    1. 我可以用 unsigned short 储存它。这样做的好处是它将使用更少的存储空间来存储值。性能会受到影响吗?

    2. 如果我决定将数据存储为 short 但是所有的调用函数都使用 int ,在存储或提取值时,需要在这些数据类型之间进行转换。性能会受到影响吗?演出的损失会是巨大的吗?

    3. 如果我决定不使用 短的 但只有10位被压缩成一个数组 无符号整型 . 在这种情况下,与以前的情况相比会发生什么?

    3 回复  |  直到 16 年前
        1
  •  10
  •   doublep    16 年前

    这完全取决于体系结构。位字段是 通常地 速度较慢,但如果您能够显著降低内存使用率,甚至可以 获得 在性能方面,由于更好的CPU缓存和类似的东西。同样的短(尽管在任何情况下都不是戏剧性的)。

    最好的方法是使源代码能够轻松地切换表示(当然是在编译时)。然后您将能够在 你的具体情况 顺便说一下,换一个 #define .

    另外,不要忘记过早的优化规则。先让它工作。如果结果是速度慢/不够快,只有 然后 试着加快速度。

        2
  •  2
  •   Loki Astari    16 年前

    我可以用无符号的short来存储它。

    是的,您可以使用无符号短(假设(sizeof(unsigned short)*char_bits)>=10)

    这样做的好处是它将使用更少的存储空间来存储值。

    少于什么?小于int?取决于系统的大小(int)?

    性能会受到影响吗?

    视情况而定。int类型应该是系统中最有效的整数类型,因此使用short可能会影响性能。是否这样做将取决于系统。计时并找出答案。

    如果我决定将数据存储为短的,但所有调用函数都使用int,那么在存储或提取值时,会发现我需要在这些数据类型之间进行转换。

    对。但是编译器会自动进行转换。不过,您需要注意的一件事是有符号和无符号类型之间的转换。如果该值不匹配,则可以定义实现的确切结果。

    性能会受到影响吗?

    也许吧。如果sizeof(unsigned int)==sizeof(unsigned short),则可能不是。计时看。

    演出的损失会是巨大的吗?

    计时看。

    如果我决定不使用short,而是将10位压缩到一个无符号int数组中。在这种情况下,与以前的整数相比会发生什么?

    计时看。

        3
  •  2
  •   Rex Kerr    16 年前

    一个好的折衷办法是将三个值打包成32位int(其中两个位未使用)。从一个位数组中解开10位要花费很多,而且不会节省很多空间。您可以使用位字段,也可以自己动手:

    (i&0x3FF) // Get i[0]
    (i>>10)&0x3FF // Get i[1]
    (i>>20)&0x3FF // Get i[2]
    i = (i&0x3FFFFC00) | (j&0x3FF)  // Set i[0] to j
    i = (i&0x3FF003FF) | ((j&0x3FF)<<10)  // Set i[1] to j
    i = (i&0xFFFFF)    | ((j&0x3FF)<<20)  // Set i[2] to j
    

    您可以在这里看到它是多少额外的费用:一个位操作和一个班次的2/3(平均)为GET,三个位操作和一个班次的2/3(平均)为设置。可能还不错,尤其是当你得到的值不是设定的时候。