C ++性能:两个短路与int位操作

时间:2015-05-12 00:04:30

标签: c++ performance

这些选项有哪些最佳性能: 使用两个短路来获得两个明智的信息,或者使用一个int并使用位操作来检索每个敏感信息的一半?

1 个答案:

答案 0 :(得分:-1)

这可能因体系结构和编译器而异,但通常使用int和bit操作的性能稍差。但是性能的差异将是如此微小,直到现在我还没有编写需要这种优化级别的代码。我依赖编译器对我进行这些优化。

现在让我们检查下面模拟行为的C ++代码:

int main()
{
    int x = 100;
    short a = 255;
    short b = 127;
    short p = x >> 16;
    short q =  x & 0xffff;
    short y =  a;
    short z = b;

    return 0;
}

x86_64系统上的相应汇编代码(来自gnu g ++)如下所示:

00000000004004ed <main>:
int main()
{
  4004ed:   55                      push   %rbp
  4004ee:   48 89 e5                mov    %rsp,%rbp
    int x = 100;
  4004f1:   c7 45 fc 64 00 00 00    movl   $0x64,-0x4(%rbp)
    short a = 255;
  4004f8:   66 c7 45 f0 ff 00       movw   $0xff,-0x10(%rbp)
    short b = 127;
  4004fe:   66 c7 45 f2 7f 00       movw   $0x7f,-0xe(%rbp)
    short p = x >> 16;
  400504:   8b 45 fc                mov    -0x4(%rbp),%eax
  400507:   c1 f8 10                sar    $0x10,%eax
  40050a:   66 89 45 f4             mov    %ax,-0xc(%rbp)
    short q =  x & 0xffff;
  40050e:   8b 45 fc                mov    -0x4(%rbp),%eax
  400511:   66 89 45 f6             mov    %ax,-0xa(%rbp)
    short y =  a;
  400515:   0f b7 45 f0             movzwl -0x10(%rbp),%eax
  400519:   66 89 45 f8             mov    %ax,-0x8(%rbp)
    short z = b;
  40051d:   0f b7 45 f2             movzwl -0xe(%rbp),%eax
  400521:   66 89 45 fa             mov    %ax,-0x6(%rbp)

    return 0;
  400525:   b8 00 00 00 00          mov    $0x0,%eax
}

如我们所见,“短p = x>> 16”是最慢的,因为它使用额外昂贵的右移操作。虽然所有其他任务在成本方面都是相同的。