рд╕реА рдмрдирд╛рдо рдЧреЛ рд▓реВрдкреНрд╕ рдФрд░ рд╕рд░рд▓ рдЧрдгрд┐рдд

рдЬрдм рдореИрдВ рд╕реА рдореЗрдВ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рд╕реЗ рдердХ рдЧрдпрд╛, рддреЛ рдХрдИ рдХреА рддрд░рд╣, рдореБрдЭреЗ рдЧреЛ рдореЗрдВ рджрд┐рд▓рдЪрд╕реНрдкреА рдереАред рдпрд╣ рдХрдбрд╝рд╛рдИ рд╕реЗ рдЯрд╛рдЗрдк рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рд╕рдВрдХрд▓рд┐рдд рд╣реИ, рдЗрд╕рд▓рд┐рдП рдХрд╛рдлреА рдЙрддреНрдкрд╛рджрдХ рд╣реИред рдФрд░ рдлрд┐рд░ рдореИрдВ рдпрд╣ рдЬрд╛рдирдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛ рдХрд┐ рдЧреЛ рдХреЗ рд░рдЪрдирд╛рдХрд╛рд░реЛрдВ рдХреЛ рдЫреЛрд░реЛрдВ рдФрд░ рд╕рдВрдЦреНрдпрд╛рдУрдВ рдХреЗ рд╕рд╛рде рдЕрдкрдиреЗ рдХрд╛рдо рдХрд╛ рдЕрдиреБрдХреВрд▓рди рдХрд░рдиреЗ рдореЗрдВ рдХрд┐рддрдиреА рдЙрд▓рдЭрди рдереАред

рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рджреЗрдЦрддреЗ рд╣реИрдВ рдХрд┐ рд╕реА рдХреИрд╕реЗ рдХрд░ рд░рд╣рд╛ рд╣реИред

рд╣рдо рдРрд╕рд╛ рд╕рд░рд▓ рдХреЛрдб рд▓рд┐рдЦрддреЗ рд╣реИрдВ:

#include <stdint.h> #include <stdio.h> int main() { uint64_t i; uint64_t j = 0; for ( i = 10000000; i>0; i--) { j ^= i; } printf("%lu\n", j); return 0; } 

O2 рдХреЗ рд╕рд╛рде рд╕рдВрдХрд▓рди, рдЬреБрджрд╛ рдХрд░реЗрдВ:

 564: 31 d2 xor %edx,%edx 566: b8 80 96 98 00 mov $0x989680,%eax 56b: 0f 1f 44 00 00 nopl 0x0(%rax,%rax,1) 570: 48 31 c2 xor %rax,%rdx 573: 48 83 e8 01 sub $0x1,%rax 577: 75 f7 jne 570 <main+0x10> 

рд╣рдореЗрдВ рдирд┐рд╖реНрдкрд╛рджрди рд╕рдордп рдорд┐рд▓рддрд╛ рд╣реИ:

рд╡рд╛рд╕реНрддрд╡рд┐рдХ 0m0,023s
рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ 0m0,019s
sys 0m0,004s

рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рддреЗрдЬреА рд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╣реАрдВ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ рдЖрдзреБрдирд┐рдХ рдкреНрд░реЛрд╕реЗрд╕рд░ рд╣реИ, рдРрд╕реЗ рдСрдкрд░реЗрд╢рдиреЛрдВ рдХреЗ рд▓рд┐рдП рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рддреЗрдЬреА рд╕реЗ рд░рдЬрд┐рд╕реНрдЯрд░ рд╣реИрдВред рд╣рдо рд╡рд┐рдХрд▓реНрдкреЛрдВ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рддреЗ рд╣реИрдВ gcc -mfpmath = sse -msse4.2 рдЬрд┐рд╕рдХрд╛ рдкрд░рд┐рдгрд╛рдо рд╕рдорд╛рди рд╣реИред
Add -O3 рдФрд░ рдЪрд┐рдпрд░реНрд╕:

  57a: 66 0f 1f 44 00 00 nopw 0x0(%rax,%rax,1) 580: 83 c0 01 add $0x1,%eax 583: 66 0f ef c8 pxor %xmm0,%xmm1 587: 66 0f d4 c2 paddq %xmm2,%xmm0 58b: 3d 40 4b 4c 00 cmp $0x4c4b40,%eax 590: 75 ee jne 580 <main+0x20> 

рдпрд╣ рджреЗрдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ SSE2 рдХрдорд╛рдВрдб рдФрд░ SSE рд░рдЬрд┐рд╕реНрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рд╣рдореЗрдВ рдПрдХ рдЯреНрд░рд┐рдкрд▓ рдкреНрд░рджрд░реНрд╢рди рд╡реГрджреНрдзрд┐ рдорд┐рд▓рддреА рд╣реИ:

рдЕрд╕рд▓реА 0m0,006s
рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ 0m0,006s
sys 0m0,000s

рдЧреЛ рдкрд░ рднреА:

 package main import "fmt" func main() { i := 0 j := 0 for i = 10000000; i>0; i-- { j ^= i } fmt.Println(j) } 

 0x000000000048211a <+42>: lea -0x1(%rax),%rdx 0x000000000048211e <+46>: xor %rax,%rcx 0x0000000000482121 <+49>: mov %rdx,%rax 0x0000000000482124 <+52>: test %rax,%rax 0x0000000000482127 <+55>: ja 0x48211a <main.main+42> 


рд╕рдордп рдЬрд╛рдирд╛:
рдирд┐рдпрдорд┐рдд рдЬрд╛рдирд╛:
рдЕрд╕рд▓реА 0m0,021
рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ 0m0,018s
sys 0m0,004s

gccgo:
рд╡рд╛рд╕реНрддрд╡рд┐рдХ 0m0,058s
рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ 0m0,036s
sys 0m0,014

рдкреНрд░рджрд░реНрд╢рди, рдЬреИрд╕рд╛ рдХрд┐ C рдФрд░ O2 рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рднреА рд╣реЛрддрд╛ рд╣реИ, рдЙрд╕реА рдкрд░рд┐рдгрд╛рдо рдХреЛ рдЖрдЧреЗ рдмрдврд╝рд╛рддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдпрд╣ рдирд┐рдпрдорд┐рдд рдЧреЛ (1.10.4) рд╕рдВрдХрд▓рдХ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдЕрдзрд┐рдХ рд╕рдордп рддрдХ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рдЗрд╕ рддрдереНрдп рдХреЗ рдХрд╛рд░рдг рдХрд┐ рдирд┐рдпрдорд┐рдд рдХрдВрдкрд╛рдЗрд▓рд░ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдереНрд░реЗрдб рдХреЗ рд▓реЙрдиреНрдЪ рдХрд╛ рдЕрдиреБрдХреВрд▓рди рдХрд░рддрд╛ рд╣реИ (рдореЗрд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, 4 рдХреЛрд░ рдкрд░ 5 рдЕрддрд┐рд░рд┐рдХреНрдд рдзрд╛рдЧреЗ рдмрдирд╛рдП рдЧрдП рдереЗ), рдПрдкреНрд▓рд┐рдХреЗрд╢рди рддреЗрдЬреА рд╕реЗ рдЪрд▓рддрд╛ рд╣реИред

рдирд┐рд╖реНрдХрд░реНрд╖



рдореИрдВ рдЕрднреА рднреА рдорд╛рдирдХ рдЧреЛ рд╕рдВрдХрд▓рдХ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдореЗрдВ рдХрд╛рдордпрд╛рдм рд░рд╣рд╛, рдЬреЛ рд▓реВрдк рдХреЗ рд▓рд┐рдП рдирд┐рд░реНрджреЗрд╢ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕реЗ рд╕реНрд╡рджреЗрд╢реА рдлреНрд▓реЛрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдлрд┐рд╕рд▓ рдХрд░ рджреЗ рд░рд╣рд╛ рд╣реИред

 package main // +build amd64 import "fmt" func main() { var i float64 = 0 var j float64 = 0 for i = 10000000; i>0; i-- { j += i } fmt.Println(j) } 


0x0000000000484bbe <+46>: movsd 0x4252a(%rip),%xmm3 # 0x4c70f0 <$f64.3ff0000000000000>
0x0000000000484bc6 <+54>: movups %xmm0,%xmm4
0x0000000000484bc9 <+57>: subsd %xmm3,%xmm0
0x0000000000484bcd <+61>: addsd %xmm4,%xmm1
0x0000000000484bd1 <+65>: xorps %xmm2,%xmm2
0x0000000000484bd4 <+68>: ucomisd %xmm2,%xmm0
0x0000000000484bd8 <+72>: ja 0x484bbe <main.main+46>

Source: https://habr.com/ru/post/hi432986/


All Articles