【问题标题】:Fastest way to split a word into two bytes将一个单词分成两个字节的最快方法
【发布时间】:2013-07-25 11:09:29
【问题描述】:

那么将一个单词分成两个字节的最快方法是什么?

short s = 0x3210;
char c1 = s >> 8;
char c2 = s & 0x00ff;

short s = 0x3210;
char c1 = s >> 8;
char c2 = (s << 8) >> 8;

编辑

怎么样

short s = 0x3210;
char* c = (char*)&s; // where c1 = c[0] and c2 = c[1]

【问题讨论】:

  • 每一个都做几百万次,然后计时。
  • 你试过第二个吗?我的第一个猜测是它不起作用(即使它起作用,它也是高度特定于平台的)。你为什么还要关心 ZOMG 最快的方式呢?转变和面具不仅非常清晰和明显,而且极不可能成为您的瓶颈。
  • 生成汇编代码并通过指令数量亲自查看或将这些语句复制到大量并使用可用的计时功能

标签: c++ c performance bit-manipulation operation


【解决方案1】:

让编译器为您完成这项工作。使用union,其中字节将被拆分而无需任何手工位移。看伪代码:

union U {
  short s;  // or use int16_t to be more specific
  //   vs.
  struct Byte {
    char c1, c2;  // or use int8_t to be more specific
  }
  byte;
};

用法很简单:

U u;
u.s = 0x3210;
std::cout << u.byte.c1 << " and " << u.byte.c2;

这个概念很简单,之后您可以根据需要重载运算符以使其更花哨。

需要注意的是,根据您的编译器,c1c2 的顺序可能会有所不同,但这将在编译之前知道。您可以设置一些条件宏以确保顺序符合您在任何编译器中的需要。

【讨论】:

  • 使用结构体而不是 char ch[2] 有什么好处?
  • @Saksham,在这种情况下没有优势;而使用char c[2]; 是一种更好的方法。我只是在一般情况下举一个例子。通常我使用整数类型与具有各种位字段的结构,这将匹配该整数大小。
  • @Jonas,不要那样做。不推荐这种 C 风格的类型转换,它被认为是丑陋的。如果没有类型转换,它将导致编译器错误(这是出于正确的原因)。寻求便携的做事方式。
【解决方案2】:

我 99.9% 确信在几乎所有架构中第一个至少与第二个一样快。可能有一些架构没有区别(它们是相等的),而在几种架构中,后者会更慢。

我要说第二个较慢的主要原因是有两个班次可以得出c2 号码。处理器在完成第一个班次之前不能开始处理第二个班次。

此外,编译器很可能能够用第一个做其他聪明的事情(如果有指令可以做到这一点 - 例如 x86 处理器可以将 s 加载到 AX 中,并将 AL 存储到 c1 和啊到c2 - 除了存储操作之外没有额外的指令),其中第二个不太可能是“已知的常见模式”(我当然从未见过在代码中使用该变体,其中shift/and 方法非常常用 - 通常用于“像素循环”,这意味着对其进行良好的优化至关重要)。

和往常一样,测量,测量,再测量。除非您只对您的特定机器性能感兴趣,否则请在不同型号/处理器制造商上进行尝试,这样您就不会在您的机器型号上制造速度快 5% 的东西,但在另一个型号上却慢 20%。

【讨论】:

    【解决方案3】:

    您当然应该使用强制转换而不是掩码或两次移位来提取低位字节。然后编译器将执行它已经知道最快的任何事情。这样就剩下高位位了,只有一个选择。

    【讨论】:

      【解决方案4】:

      您应该在for (long i = 0; i &lt; 100000000; i++) 中为每个人计时。我做到了,第一个更快(0.82s 对 0.84s)。在 MVS 中这样做的一种简单方法是在 @clk 上设置监视。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-11-07
        • 1970-01-01
        • 2019-01-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-06-02
        • 2014-04-30
        相关资源
        最近更新 更多