这些选项有哪些最佳性能: 使用两个短路来获得两个明智的信息,或者使用一个int并使用位操作来检索每个敏感信息的一半?
答案 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”是最慢的,因为它使用额外昂贵的右移操作。虽然所有其他任务在成本方面都是相同的。