जीसीसी 4.8 इसके साथ क्या करता है यह देखने के लिए विघटित करते हैं
ब्लागॉवेस्ट ने पाइपलाइन को बेहतर बनाने के लिए शाखा व्युत्क्रम का उल्लेख किया, लेकिन क्या वर्तमान संकलक वास्तव में ऐसा करते हैं? चलो पता करते हैं!
के बिना __builtin_expect
#include "stdio.h"
#include "time.h"
int main() {
/* Use time to prevent it from being optimized away. */
int i = !time(NULL);
if (i)
puts("a");
return 0;
}
संकलन और जीसीसी 4.8.2 x86_64 लिनक्स के साथ विघटित:
gcc -c -O3 -std=gnu11 main.c
objdump -dr main.o
आउटपुट:
0000000000000000 <main>:
0: 48 83 ec 08 sub $0x8,%rsp
4: 31 ff xor %edi,%edi
6: e8 00 00 00 00 callq b <main+0xb>
7: R_X86_64_PC32 time-0x4
b: 48 85 c0 test %rax,%rax
e: 75 0a jne 1a <main+0x1a>
10: bf 00 00 00 00 mov $0x0,%edi
11: R_X86_64_32 .rodata.str1.1
15: e8 00 00 00 00 callq 1a <main+0x1a>
16: R_X86_64_PC32 puts-0x4
1a: 31 c0 xor %eax,%eax
1c: 48 83 c4 08 add $0x8,%rsp
20: c3 retq
स्मृति में निर्देश क्रम अपरिवर्तित था: पहले puts
और फिर retq
वापस लौटें।
साथ में __builtin_expect
अब इसके if (i)
साथ बदलें :
if (__builtin_expect(i, 0))
और हमें मिलता है:
0000000000000000 <main>:
0: 48 83 ec 08 sub $0x8,%rsp
4: 31 ff xor %edi,%edi
6: e8 00 00 00 00 callq b <main+0xb>
7: R_X86_64_PC32 time-0x4
b: 48 85 c0 test %rax,%rax
e: 74 07 je 17 <main+0x17>
10: 31 c0 xor %eax,%eax
12: 48 83 c4 08 add $0x8,%rsp
16: c3 retq
17: bf 00 00 00 00 mov $0x0,%edi
18: R_X86_64_32 .rodata.str1.1
1c: e8 00 00 00 00 callq 21 <main+0x21>
1d: R_X86_64_PC32 puts-0x4
21: eb ed jmp 10 <main+0x10>
puts
समारोह, के बहुत अंत करने के लिए ले जाया गया था retq
वापसी!
नया कोड मूल रूप से समान है:
int i = !time(NULL);
if (i)
goto puts;
ret:
return 0;
puts:
puts("a");
goto ret;
यह अनुकूलन के साथ नहीं किया गया था -O0
।
लेकिन __builtin_expect
बिना किसी उदाहरण के साथ तेजी से चलने वाले उदाहरण को लिखने का सौभाग्य , उन दिनों सीपीयू वास्तव में स्मार्ट हैं । मेरी भोली कोशिश यहाँ हैं ।
सी ++ 20 [[likely]]
और[[unlikely]]
C ++ 20 ने उन C ++ बिल्ट-इन को मानकीकृत किया है: C ++ 20 की संभावना / संभावना नहीं का उपयोग करने के लिए if-else स्टेटमेंट में वे संभवतया (एक वाक्य!) एक ही काम करेंगे।