【发布时间】:2018-08-31 01:34:02
【问题描述】:
我正在对循环代码中的一些计数进行基准测试。 g++ 与 -O2 代码一起使用,我注意到当某些条件在 50% 的情况下为真时,它会出现一些性能问题。我认为这可能意味着代码会进行不必要的跳转(因为 clang 会产生更快的代码,所以它不是一些基本限制)。
我在这个 asm 输出中发现有趣的是代码跳过了一个简单的添加。
=> 0x42b46b <benchmark_many_ints()+1659>: movslq (%rdx),%rax
0x42b46e <benchmark_many_ints()+1662>: mov %rax,%rcx
0x42b471 <benchmark_many_ints()+1665>: imul %r9,%rax
0x42b475 <benchmark_many_ints()+1669>: shr $0xe,%rax
0x42b479 <benchmark_many_ints()+1673>: and $0x1ff,%eax
0x42b47e <benchmark_many_ints()+1678>: cmp (%r10,%rax,4),%ecx
0x42b482 <benchmark_many_ints()+1682>: jne 0x42b488 <benchmark_many_ints()+1688>
0x42b484 <benchmark_many_ints()+1684>: add $0x1,%rbx
0x42b488 <benchmark_many_ints()+1688>: add $0x4,%rdx
0x42b48c <benchmark_many_ints()+1692>: cmp %rdx,%r8
0x42b48f <benchmark_many_ints()+1695>: jne 0x42b46b <benchmark_many_ints()+1659>
请注意,我的问题不是如何修复我的代码,我只是问是否有理由说明 O2 的优秀编译器会生成 jne 指令以跳过 1 条廉价指令。 我问是因为从what I understand 可以“简单地”获得比较结果并使用它来将计数器(在我的示例中为 rbx)增加 0 或 1。
编辑:来源: https://godbolt.org/z/v0Iiv4
【问题讨论】:
-
发布生成此程序集的 C/C++ 代码可能是个好主意?
标签: gcc assembly compiler-optimization