C / C +: рдпреЗ рдХрдкрдЯреА рд╕реНрдЯреНрд░рд┐рдВрдЧ рд╕реЗрдЯ рд╣реИрдВред

рдХрдИ "рдЬрд╛рдирддреЗ рд╣реИрдВ" рдХрд┐ рд╕реА / рд╕реА ++ рдореЗрдВ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдЖрдкрдХреЛ рдРрд╕реЗ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ рдЬреЛ рд▓рдЧрднрдЧ рдЕрд╕реЗрдВрдмрд▓рд░ рдореЗрдВ рд▓рд┐рдЦреЗ рдЧрдП рдХрд╛рд░реНрдпрдХреНрд░рдореЛрдВ рдХреЗ рд░реВрдк рдореЗрдВ рддреЗрдЬреА рд╕реЗ рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рд╡реЗ, рдЬреЛ рд╕рд┐рджреНрдзрд╛рдВрдд рд░реВрдк рдореЗрдВ рд╕рдВрднрд╡ рдХреЗ рд░реВрдк рдореЗрдВ рддреЗрдЬрд╝ рд╣реИрдВред



рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ, рдпрд╣ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╕рдЪ рдирд╣реАрдВ рд╣реИ (рдФрд░ рджреБрд░реНрд▓рдн рдорд╛рдорд▓реЛрдВ рдореЗрдВ, рдпрд╣ рдмрд┐рд▓реНрдХреБрд▓ рднреА рдРрд╕рд╛ рдирд╣реАрдВ рд╣реИ), рд▓реЗрдХрд┐рди рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, C / C ++ рдкреНрд░реЛрдЧреНрд░рд╛рдо рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рддреЗрдЬрд╝ рд╣реИрдВ, рдереЛрдбрд╝реА рдореЗрдореЛрд░реА рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ рдФрд░ рддреБрд░рдВрдд рдЪрд▓рд╛рддреЗ рд╣реИрдВред рдпрджрд┐ рдЖрдк рдЙрдиреНрд╣реЗрдВ рд╕рд╣реА рддрд░реАрдХреЗ рд╕реЗ рд▓рд┐рдЦрддреЗ рд╣реИрдВред



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



рдРрд╕реА рд╕реВрдЪрд┐рдпрд╛рдБ рдХрд╣рд╛рдБ рд╣реЛрддреА рд╣реИрдВ? рдареАрдХ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпреЗ HTML рдЯреЛрдХрди рдХреА рд╕реВрдЪреА рд╣реЛ рд╕рдХрддреА рд╣реИ рдЬреЛ рдЖрдкрдХреЗ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддреА рд╣реИред рдпрд╛ рдЖрдкрдХреЗ рд╢реЗрд▓ рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдЖрджреЗрд╢реЛрдВ рдХреА рдПрдХ рд╕реВрдЪреАред рд▓реЗрдХрд┐рди, рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ, рдЕрдХреНрд╕рд░ рдРрд╕реЗ рд╕реЗрдЯ рд╕рднреА рдкреНрд░рдХрд╛рд░ рдХреА рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреА рд╕реВрдЪреА рдХреЗ рд░реВрдк рдореЗрдВ рджрд┐рдЦрд╛рдИ рджреЗрддреЗ рд╣реИрдВ: рд╕реНрдЯреНрд░рд░реЛрд░, рдЧреИрд╕реНрдЯреНрд░реЙрд╕реНрдЯрд░, рд░реЗрдЧреБрд▓реЗрдЯрд░реНрд╕, рдЖрджрд┐ред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдкреНрд░рддреНрдпреЗрдХ рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдХреЛ рдХрдо рд╕реЗ рдХрдо рдПрдХ рдмрд╛рд░ рдЗрд╕реА рддрд░рд╣ рдХреА рд╕рдорд╕реНрдпрд╛ рдХрд╛ рд╕рд╛рдордирд╛ рдХрд░рдирд╛ рдкрдбрд╝рд╛ рд╣реИред



рдореИрдВ рдПрдХ рдЖрд░рдХреНрд╖рдг рдмрдирд╛рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдХрд┐ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╡рд┐рд╡рд░рдг рдХреЗрд╡рд▓ рдСрдкрд░реЗрдЯрд┐рдВрдЧ рд╕рд┐рд╕реНрдЯрдо рдкрд░ рд▓рд╛рдЧреВ рд╣реЛрддрд╛ рд╣реИ рдЬреЛ рдХрд┐ рдПрд▓рдПрд▓рдПрдл рдкреНрд░рд╛рд░реВрдк: рд▓рд┐рдирдХреНрд╕, рдореИрдХрдУрдПрд╕ рдЗрддреНрдпрд╛рджрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред рд╡рд┐рдВрдбреЛрдЬ рдпрд╛ рдПрдореНрдмреЗрдбреЗрдб рд╕рд┐рд╕реНрдЯрдо рдкрд░, рд╕реНрдерд┐рддрд┐ рдереЛрдбрд╝реА рдЕрд▓рдЧ рд╣реЛ рд╕рдХрддреА рд╣реИред рд╕рд╛рде рд╣реА, рдЗрд╕ рдмрд╛рд░ рдореИрдВ рдЦреБрдж рдХреЛ рдХреЗрд╡рд▓ рдПрдХ рд╕реАрдзреА рд╕рдорд╕реНрдпрд╛ (рд╕рдВрдЦреНрдпрд╛ рджреНрд╡рд╛рд░рд╛ рдПрдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП) рдореЗрдВ рд╕реАрдорд┐рдд рдХрд░ рджреВрдВрдЧрд╛ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рд╣реИ, рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рд╕рд░рд▓, рдФрд░ рджреВрд╕рд░реА рдмрд╛рдд, рдЙрд▓рдЯрд╛ рд╕рдорд╕реНрдпрд╛ рдХреЗ рдХрдИ рд╕рдорд╛рдзрд╛рдиреЛрдВ рдореЗрдВ рд╕рдорд╛рдзрд╛рди рдХреЗ рд╣рд┐рд╕реНрд╕реЗ рдХреЗ рд░реВрдк рдореЗрдВ рдПрдХ рд╕реАрдзреА рд╕рдорд╕реНрдпрд╛ рд╣реИред



рддреЛ, рдЪрд▓реЛ рдХрд╛рд░реНрдп рд╕реЗрдЯ рдХрд░реЗрдВред рд╣рдо рдПрдХ рдЧрд▓рдд рдХрд╛рд░реНрдп рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдЬреЛ рддреНрд░реБрдЯрд┐ рд╕рдВрдЦреНрдпрд╛ рджреНрд╡рд╛рд░рд╛ рдПрдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ рд▓реМрдЯрд╛рддрд╛ рд╣реИред рдореИрдВ рдПрдХ рд╕рдорд╛рди рдлрд╝рдВрдХреНрд╢рди рдХреИрд╕реЗ рд▓рд┐рдЦ рд╕рдХрддрд╛ рд╣реВрдВ?



рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдорд╛рдереЗ рдореЗрдВ:



const char * рдЗрд░реЗрдЯрд╛ ( int nr ) {

рд╕реНрд╡рд┐рдЪ ( рдПрдирдЖрд░ ) {

рдорд╛рдорд▓рд╛ 0 : рд░рд┐рдЯрд░реНрди "X00000X" ;

рдХреЗрд╕ 1 : рд░рд┐рдЯрд░реНрди "X00001X" ;

...

рдорд╛рдорд▓рд╛ 9999 : рд░рд┐рдЯрд░реНрди "X09999X" ;

рдбрд┐рдлрд╝реЙрд▓реНрдЯ : "рдЕрдЬреНрдЮрд╛рдд рддреНрд░реБрдЯрд┐" рд▓реМрдЯрд╛рдПрдВ ;

}

}



рдХреНрдпрд╛ рдпрд╣ рд╡рд┐рдХрд▓реНрдк рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ? рдпрд╣ рд╣реИред рд▓реЗрдХрд┐рди рдЗрд╕рдХреЗ рд▓рд┐рдП рдХрд┐рддрдиреЗ рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ? рдЖрдЗрдП рджреЗрдЦреЗрдВ:

$ gcc -march = рджреЗрд╢реА -fPIC -O2 -sared -o libgen1.so gen1.c

$ рд╕реНрдЯреНрд░рд┐рдк --рд╕реНрдЯреНрд░рд┐рдк-рдЕрдирдПрдбреЗрдб рд▓рд┐рдмрдЬреЗрди 1ред рдПрд╕реЛ

$ рдЖрдХрд╛рд░ libgen1.so

рдЯреЗрдХреНрд╕реНрдЯ рдбреЗрдЯрд╛ рдмреАрдПрд╕рдПрд╕ рджрд┐рд╕рдореНрдмрд░ рд╣реЗрдХреНрд╕ рдлрд╝рд╛рдЗрд▓ рдирд╛рдо
201,116 272 28 201,416 312c8 libgen1.so


рд╣рдордиреЗ рдкреНрд░рддрд┐ рдкрдВрдХреНрддрд┐ 20 рдмрд╛рдЗрдЯреНрд╕ рдЦрд░реНрдЪ рдХрд┐рдПред рдЗрд╕ рддрдереНрдп рдХреЗ рдмрд╛рд╡рдЬреВрдж рдХрд┐ рд╕реНрдЯреНрд░рд┐рдВрдЧ рд╕реНрд╡рдпрдВ 8 рдмрд╛рдЗрдЯреНрд╕ рд▓реЗрддреА рд╣реИред рдХреНрдпрд╛ рдмреЗрд╣рддрд░ рдХрд░рдирд╛ рд╕рдВрднрд╡ рд╣реИ? рдордореНрдо ... рд╣рд╛рдБ, рдмрд┐рд▓реНрдХреБрд▓! рдпрд╣ рдПрдХ рд╕рд░рдгреА рдХреЗ рд░реВрдк рдореЗрдВ рд▓рд╛рдЗрдиреЛрдВ рдХреА рдПрдХ рд╕реВрдЪреА рдмрдирд╛рдиреЗ рдФрд░ рддрддреНрд╡реЛрдВ рдХреЛ рдирд┐рдХрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рд░рд▓ рдХрд╛рд░реНрдп рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╣реИред рд╕рд░рдгреА рдореЗрдВ рдкреЙрдЗрдВрдЯрд░реНрд╕ рдкреНрд░рддреНрдпреЗрдХ рдкрд░ 4 рдмрд╛рдЗрдЯреНрд╕ рдкрд░ рдХрдмреНрдЬрд╛ рдХрд░ рд▓реЗрдВрдЧреЗ рдФрд░ рдкреНрд░рддрд┐ рдкрдВрдХреНрддрд┐ 20 рдмрд╛рдЗрдЯреНрд╕ рдХреЗ рдмрдЬрд╛рдп рд╣рдо рдХреЗрд╡рд▓ 12 рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВрдЧреЗ - 40% рдХреА рдмрдЪрдд! рдЦреЗрд▓ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдореЛрдордмрддреНрддреА рдХреЗ рд▓рд╛рдпрдХ рд╣реИред



рдЬрд▓реНрдж рд╕реЗ рдЬрд▓реНрдж рдирд╣реАрдВ рдХрд╣рд╛:



рд╕реНрдерд┐рд░ рдХрд╛рд╕реНрдЯ рдЪрд╛рд░ * рдХрд╛рд╕реНрдЯ рд╕рдВрджреЗрд╢ [ ] = {

[ реж ] = "X00000X" ,

[ рез ] = "X00001X" ,

...

[ 9999 ] = "X09999X" ,

} ;



const char * рдЗрд░реЗрдЯрд╛ ( int nr ) {

if ( nr < 0 || nr> sizeof ( msgs ) / sizeof ( msgs [ 0 ] ) )

рд╡рд╛рдкрд╕реА "рдЕрдЬреНрдЮрд╛рдд рддреНрд░реБрдЯрд┐" ;

рд╡рд╛рдкрд╕реА рд╕рдВрджреЗрд╢ [ рдПрдирдЖрд░ ] ;

}



$ gcc -march = рджреЗрд╢реА -fPIC -O2 -sared -o libgen2.so gen2.c

$ рд╕реНрдЯреНрд░рд┐рдк --рд╕реНрдЯреНрд░рд┐рдк-рдЕрдирдПрдбреЗрдб рд▓рд┐рдмрдЬреЗрди 2ред рдПрд╕реЛ

$ рдЖрдХрд╛рд░ libgen2.so

рдЯреЗрдХреНрд╕реНрдЯ рдбреЗрдЯрд╛ рдмреАрдПрд╕рдПрд╕ рджрд┐рд╕рдореНрдмрд░ рд╣реЗрдХреНрд╕ рдлрд╝рд╛рдЗрд▓ рдирд╛рдо
161,110 40272 28 201,410 312c2 libgen2.so


рдПрдХ рднрд╡реНрдп рдЙрдкрд▓рдмреНрдзрд┐! 6 рдмрд╛рдЗрдЯреНрд╕ рдмрдЪрд╛рдПрдВ? рдХреНрдпрд╛ рд╣реБрдЖ? рддрд╛рд▓рд┐рдХрд╛ рдореЗрдВ 80'000 рдмрд╛рдЗрдЯреНрд╕ рд╣реИрдВ (рдЗрд╕реЗ рд╕рдВрд╢реЛрдзрд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рддрд╛рдХрд┐ рдЗрд╕реЗ рдкрд╛рда рдХреЗ рд░реВрдк рдореЗрдВ рд╕рдВрд░рдХреНрд╖рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХреЗ), рд▓реЗрдХрд┐рди рд╣рдореЗрдВ рдЯреЗрдХреНрд╕реНрдЯ рдХреА ~ 80'000 рдЕрдзрд┐рдХ рдмрд╛рдЗрдЯреНрд╕ рдХрд╣рд╛рдВ рдорд┐рд▓реАрдВ (рд╣рдо 40'000 рдмрд╛рдЗрдЯреНрд╕ рдХреА рдЙрдореНрдореАрдж рдХрд░ рд░рд╣реЗ рдереЗ) рдФрд░ ~ 40'000 рдмрд╛рдЗрдЯреНрд╕ рдХрд╛ рдбреЗрдЯрд╛ (рдФрд░ рд╡реЗ рдмрд┐рд▓реНрдХреБрд▓ рдореМрдЬреВрдж рдирд╣реАрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП - рдХреНрдпрд╛ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рд╕рднреА рдЯреЗрдмрд▓ рд╕реНрдерд┐рд░ рд╣реИрдВ?)ред рдЪрд▓рд┐рдП рдЗрд╕рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рддреЗ рд╣реИрдВ:

$ relinfo libgen2.so

libgen2.so: 10007 рд╕реНрдерд╛рдирд╛рдВрддрд░рдг, 10002 рд░рд┐рд╢реНрддреЗрджрд╛рд░ (99%), 3 рдкреАрдПрд▓рдЯреА рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐рдпрд╛рдВ, рд╕реНрдерд╛рдиреАрдп рдЬрд┐рдо рдХреЗ рд▓рд┐рдП 0 (0%), 0 рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛

рд╣рд╛рдБред рдЕрдм рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд╣реИ! рдХрдВрдкрд╛рдЗрд▓рд░ рдЗрд╕ рддрд╛рд▓рд┐рдХрд╛ рдХреА рдЧрдгрдирд╛ рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рдЗрд╕реЗ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЛ рд▓рд┐рдЦ рд╕рдХрддрд╛ рд╣реИ: рдЗрд╕рдХреЗ рд▓рд┐рдП рдЖрдкрдХреЛ рдЙрд╕ рдкрддреЗ рдХрд╛ рдкрддрд╛ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рдЬрд┐рд╕ рдкрд░ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЛ рд░рдирдЯрд╛рдЗрдо рдореЗрдВ рдореЗрдореЛрд░реА рдореЗрдВ рд░рдЦрд╛ рдЬрд╛рдПрдЧрд╛ - рдФрд░ рдпрд╣ рдЬрд╛рдирдХрд╛рд░реА рдЙрд╕реЗ рдЬреНрдЮрд╛рдд рдирд╣реАрдВ рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛: рдПрдХ рдирд┐рдпрдо рдХреЗ рд░реВрдк рдореЗрдВ, рдпрд╣ рдЬрд╛рдирдХрд╛рд░реА рд▓рд┐рдВрдХрд░ рдХреЗ рд▓рд┐рдП рднреА рдЕрдЬреНрдЮрд╛рдд рд╣реИ - рдЗрд╕рд▓рд┐рдП, рдпрд╣ рдкрд╛рда рдЦрдВрдб рдореЗрдВ рдирд╣реАрдВ, рдмрд▓реНрдХрд┐ рдбреЗрдЯрд╛ рдЦрдВрдб рдореЗрдВ рдПрдХ рддрд╛рд▓рд┐рдХрд╛ рдмрдирд╛рддрд╛ рд╣реИ рдФрд░ рдПрдХ рдФрд░ рддрд╛рд▓рд┐рдХрд╛ рдмрдирд╛рддрд╛ рд╣реИ - рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЧрддрд┐рд╢реАрд▓ рд▓рд┐рдВрдХрд░ рдХреЗ рд▓рд┐рдПред рдЬреЛ рдХрд╛рд░реНрдпрдХреНрд░рдо рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд╕рдордп рдЗрд╕реЗ рднрд░рддрд╛ рд╣реИред рд╣рдореНрдо ... рдФрд░ рдпрд╣ рд╕рдм - рддрд╛рд▓рд┐рдХрд╛ рдХреЗ рд▓рд┐рдП, рдЬреЛ, рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рд╕рдВрднрд╛рд╡рдирд╛ рд╣реИ, рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдмрд┐рд▓реНрдХреБрд▓ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛! рдХреМрди рддреБрд░рдВрдд рдХрд╛рд░реНрдпрдХреНрд░рдореЛрдВ рдХреЛ рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░ рд░рд╣рд╛ рдерд╛?



рдХреНрдпрд╛ рдХрд░реЗрдВ? рдЬрд╛рд╣рд┐рд░ рд╣реИ, рдЯреЗрдмрд▓ рдХреЛ рдкреБрдирд░реНрдЧрдард┐рдд рдХрд░рдирд╛ рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛ рддрд╛рдХрд┐ рдЧрдгрдирд╛ рдЧрддрд┐рд╢реАрд▓ рд▓рд┐рдВрдХрд░ рджреНрд╡рд╛рд░рд╛ рд╣рд░ рдмрд╛рд░ рдХрд╛рд░реНрдпрдХреНрд░рдо рд╢реБрд░реВ рд╣реЛрдиреЗ рдкрд░ рдирд╣реАрдВ, рдмрд▓реНрдХрд┐ рд╣рдорд╛рд░реЗ рдХрд╛рд░реНрдпрдХреНрд░рдо рджреНрд╡рд╛рд░рд╛ рдХреА рдЬрд╛рдП - рдФрд░ рдХреЗрд╡рд▓ рдЬрд╣рд╛рдВ рдЙрдиреНрд╣реЗрдВ рдЬрд░реВрд░рдд рд╣реЛред рдпрд╣ рдХреИрд╕реЗ рдХрд░рдирд╛ рд╣реИ? рдЕрдХреЗрд▓реЗ рд╣рдо рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХрд╛ рд╕рд╛рдордирд╛ рдирд╣реАрдВ рдХрд░ рд░рд╣реЗ рд╣реИрдВ? рдпрд╣ рдХреИрд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдХрд╣рддреЗ рд╣реИрдВ, glibc рдореЗрдВ? рдФрд░ рдЗрд╕рд▓рд┐рдП : рд╕рднреА рд▓рд╛рдЗрдиреЛрдВ рдХреЛ рдПрдХ рдЕрд▓рдЧ рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдирд┐рдХрд╛рд▓рд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬрд┐рд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдореБрдЦреНрдп рдХрд╛рд░реНрдпрдХреНрд░рдо рджреНрд╡рд╛рд░рд╛ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

рдлрд╝рд╛рдЗрд▓ stringtab.h рдореЗрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╢рд╛рдорд┐рд▓ рд╣реИрдВ:

_S ( 0 , "X00000X" )

_S ( 1 , "X00001X" )

...

_S ( 9999 , "X09999X" )

рдФрд░ рдХрд╛рд░реНрдпрдХреНрд░рдо рдпрд╣ рд╣реИ:

# рдЕрд▓рдЧ рдХрд░реЗрдВ <stddef.h>



#define MSGSTRFIELD (рд▓рд╛рдЗрди) MSGSTRFIELD1 (рд▓рд╛рдЗрди)

#define MSGSTRFIELD1 (рд▓рд╛рдЗрди) str ## рд▓рд╛рдЗрди

рд╕реНрдерд┐рд░ рдХрд╛рд╕реНрдЯ рд╕рдВрдШред

рд╕рдВрд░рдЪрдирд╛ {

#define _S (n, s) рдЪрд╛рд░ MSGSTRFIELD (__ рд▓рд╛рдЗрди __) [sizeof (s)];

# рдЬрд╛рд░реА рдХрд░реЗрдВ "stringtab.h"

#undef _S

} ;

char str [рдХреЛ реж ] ;

}} = { {

#define _S (n, s) s,

# рдЬрд╛рд░реА рдХрд░реЗрдВ "stringtab.h"

#undef _S

} } ;

рд╕реНрдерд┐рд░ рдХреЙрдиреНрд╕реНрдЯреЗрдмрд▓ рдЕрд╣рд╕реНрддрд╛рдХреНрд╖рд░рд┐рдд int .x [ ] = {

#define _S (n, s) рдСрдлрд╕реЗрдЯрдСрдлрд╝ (Union/2017_t, MSGSTRFIELD (__ LINE__)),

# рдЬрд╛рд░реА рдХрд░реЗрдВ "stringtab.h"

#undef _S

} ;

const char * рдЗрд░реЗрдЯрд╛ ( int nr ) {

if ( nr < 0 || nr> sizeof ( /2017x ) / sizeof ( msgstr " [ 0 ] ) )

рд╡рд╛рдкрд╕реА "рдЕрдЬреНрдЮрд╛рдд рддреНрд░реБрдЯрд┐" ;

рд╡рд╛рдкрд╕реА //.str + msgstrx [ nr ] ;

}

$ gcc -march = рджреЗрд╢реА -fPIC -O2 -sared -o libgen3.so gen3.c

$ рд╕реНрдЯреНрд░рд┐рдк --рд╕реНрдЯреНрд░рд┐рдк-рдЕрдирдПрдбреЗрдб рд▓рд┐рдмрдЬреЗрди 3ред рдПрд╕реЛ

$ рдЖрдХрд╛рд░ libgen3.so

рдЯреЗрдХреНрд╕реНрдЯ рдбреЗрдЯрд╛ рдмреАрдПрд╕рдПрд╕ рджрд┐рд╕рдореНрдмрд░ рд╣реЗрдХреНрд╕ рдлрд╝рд╛рдЗрд▓ рдирд╛рдо
121,136 272 28 121,436 1da5c libgen3.so


рдЕрдм рдпрд╣рд╛рдБ рдЖрджреЗрд╢ рд╣реИред рдХреЗрд╡рд▓ рдПрдХ рдкреНрд░рд╢реНрди рд╢реЗрд╖ рд╣реИ: рд╣рдордиреЗ рдЧрддрд┐рд╢реАрд▓ рд▓рд┐рдВрдХрд░ рд╕реЗ рдЧрдгрдирд╛ рдХреЛ рд╣рдорд╛рд░реЗ рдХрд╛рд░реНрдпрдХреНрд░рдо рдореЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░ рджрд┐рдпрд╛ - рдЗрд╕рд╕реЗ рдЧрддрд┐ рдкрд░ рдХрд┐рддрдирд╛ рдЕрд╕рд░ рдкрдбрд╝рд╛? рджреВрд╕рд░реЗ рд╢рдмреНрджреЛрдВ рдореЗрдВ: рдХреНрдпрд╛ рдЗрд╕ рдкрджреНрдзрддрд┐ рдХреЛ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдЬрд╣рд╛рдВ рднреА рддрд╛рд░ рдХреА рд╕реВрдЪреА рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рдпрд╛ рдХреЗрд╡рд▓ рдЬрд╣рд╛рдВ рдЧрддрд┐ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдирд╣реАрдВ рд╣реИ (рддреНрд░реБрдЯрд┐ рд╡рд╛рдкрд╕реА рдореЗрдВ рдХрд╣реЗрдВ)?



рдЗрди рдЙрджреНрджреЗрд╢реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП, рдореИрдВрдиреЗ рдПрдХ рдЫреЛрдЯрд╛ рд╕рд╛ рдХрд╛рд░реНрдпрдХреНрд░рдо рд▓рд┐рдЦрд╛ рдФрд░ рдЬреАрд╕реАрд╕реА 4.2.2 рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП, рддреАрди рдкреНрд░рдгрд╛рд▓рд┐рдпреЛрдВ рдкрд░ рдЗрд╕рдХреЗ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреА рдЬрд╛рдВрдЪ рдХреА: рдПрдПрдордбреА рдУрдкрд░реНрдЯрди (рдЯреАрдПрдо) рдкреНрд░реЛрд╕реЗрд╕рд░ 175 рдХреЗ рд╕рд╛рде, рдЗрдВрдЯреЗрд▓ рдХреЛрд░ (рдЯреАрдПрдо) 2 рд╕реАрдкреАрдпреВ 6600 рдФрд░ рдЗрдВрдЯреЗрд▓ рдкреЗрдВрдЯрд┐рдпрдо рдбреА рд╕реАрдкреАрдпреВ 3.00GHz рдХреЗ рд╕рд╛рдеред



#define _GNU_SOURCE

# рдЬрд╛рд░реА <рд╢реЗрдбреНрдпреВрд▓>

# рдЕрд▓рдЧ рдХрд░реЗрдВ <stdio.h>

# рдЬреАрдд "gen.h"



#define NUMTESTS 1000

#define NUMSTRINGS 10000



#ifdef __i386__

рд╕реНрдерд┐рд░ рдЗрдирд▓рд╛рдЗрди рдЕрд╣рд╕реНрддрд╛рдХреНрд╖рд░рд┐рдд рд▓рдВрдмреЗ рд▓рдВрдмреЗ read_tsc ( рд╢реВрдиреНрдп )

{

рдЕрд╣рд╕реНрддрд╛рдХреНрд╖рд░рд┐рдд рд▓рдВрдмреА рд▓рдВрдмреА рдШрд╛рдЯреА;

__asm__ __volatile__ ( "rdtsc" : "= A" ( val ) ) ;

рд╡рд╛рдкрд╕реА рдШрд╛рдЯреА;

}

#endif



#ifdef __x86_64__

рд╕реНрдерд┐рд░ рдЗрдирд▓рд╛рдЗрди рдЕрд╣рд╕реНрддрд╛рдХреНрд╖рд░рд┐рдд рд▓рдВрдмреЗ рд▓рдВрдмреЗ read_tsc ( рд╢реВрдиреНрдп )

{

рдЕрд╣рд╕реНрддрд╛рдХреНрд╖рд░рд┐рдд int __a, __d;

__asm__ __volatile__ ( "rdtsc" : "= a" ( __a ) , "= d" ( __d ) ) ;

рд╡рд╛рдкрд╕реА ( ( рд▓рдВрдмреЗ рд╕рдордп рддрдХ ) __a ) | ( ( рдЕрд╣рд╕реНрддрд╛рдХреНрд╖рд░рд┐рдд рд▓рдВрдмрд╛ ) __d ) << 32 ) ;

}

#endif



int main ( )

{

cpu_set_t рдЖрддреНрдореАрдпрддрд╛;

CPU_ZERO ( & рд╕рдВрдмрдВрдз ) ;

CPU_SET ( 1 , рдФрд░ рдЖрддреНрдореАрдпрддрд╛ ) ;

рд╢реЗрдбреНрдпреВрд▓_рд╕реЗрдЯрдлрд╝рд┐рдирд┐рдЯреА ( 0 , рд╕рд╛рдЗрдЬрд╝реЛрдлрд╝ ( cpu_set_t ) , рдФрд░ рдЖрддреНрдореАрдпрддрд╛ ) ;

рдЕрд╣рд╕реНрддрд╛рдХреНрд╖рд░рд┐рдд рд▓рдВрдмреЗ рд▓рдВрдмреЗ рдкрд░реАрдХреНрд╖рдг [ NUMTESTS ] ;

for ( int i = 0 ; рдореИрдВ <NUMTESTS; ++ i ) {

рдЕрд╣рд╕реНрддрд╛рдХреНрд╖рд░рд┐рдд рд▓рдВрдмреА рд▓рдВрдмреА рд╢реБрд░реБрдЖрдд = read_tsc ( ) ;

for ( int i = 0 ; рдореИрдВ <NUMSTRINGS; ++ i ) {

// рдХреБрдЫ рди рдХрд░реЗрдВ - рдУрд╡рд░рд╣реЗрдб рдХреЛ рдорд╛рдкреЗрдВ

}

testresults [ i ] = read_tsc ( ) - рдкреНрд░рд╛рд░рдВрдн;

}

рдЕрд╣рд╕реНрддрд╛рдХреНрд╖рд░рд┐рдд рд▓рдВрдмреЗ рд▓рдВрдмреЗ рдУрд╡рд░рд╣реЗрдб = рд╡реГрд╖рдг [ 0 ] ;

for ( int i = 1 ; рдореИрдВ <NUMTESTS; ++ i ) {

рдЕрдЧрд░ ( рд╡реГрд╖рдг [ i ] <рдУрд╡рд░рд╣реЗрдб )

рдУрд╡рд░рд╣реЗрдб = рд╡реГрд╖рдг [ i ] ;

}

for ( int i = 0 ; рдореИрдВ <NUMTESTS; ++ i ) {

рдЕрд╣рд╕реНрддрд╛рдХреНрд╖рд░рд┐рдд рд▓рдВрдмреА рд▓рдВрдмреА рд╢реБрд░реБрдЖрдд = read_tsc ( ) ;

for ( int i = 0 ; рдореИрдВ <NUMSTRINGS; ++ i ) {

рдЕрд╕рддреНрдп ( i ) ;

}

testresults [ i ] = read_tsc ( ) - рдкреНрд░рд╛рд░рдВрдн;

}

рдЕрд╣рд╕реНрддрд╛рдХреНрд╖рд░рд┐рдд рд▓рдВрдмреЗ рд▓рдВрдмреЗ рд╡реГрд╖рдг = рд╡реГрд╖рдг [рдХреЛ реж ] ;

for ( int i = 1 ; рдореИрдВ <NUMTESTS; ++ i ) {

рдЕрдЧрд░ ( рд╡реГрд╖рдг [ i ] <рд╡реГрд╖рдг )

testrun = testresults [ i ] ;

}

printf ( "рдЕрд╕рддреНрдп% g рд╕реАрдкреАрдпреВ рдЪрдХреНрд░ рдкреНрд░рддрд┐ рдХреЙрд▓ \ n рд▓реЗрддрд╛ рд╣реИ" ,)

( рд╡реГрд╖рдг - рдЙрдкрд░рд┐ ) / ( NUMSTRINGS * 1.0 ) ) ;

рд╡рд╛рдкрд╕реА 0 ;

}

$ gcc -march = рджреЗрд╢реА -O2 -std = c99 -o main1 main.c -Lред -lgen1

$ gcc -march = рдореВрд▓ -O2 -std = c99 -o main2 main.c -Lред -lgen2

$ gcc -march = рджреЗрд╢реА -O2 -std = c99 -o main3 main.c -Lред -lgen3

$ LD_LIBRARY_PATH =ред ./main1

рдЕрд╕рддреНрдп 44.748 рд╕реАрдкреАрдпреВ рдЪрдХреНрд░ рдкреНрд░рддрд┐ рдХреЙрд▓ рд▓реЗрддрд╛ рд╣реИ

$ LD_LIBRARY_PATH =ред ./main2

рдкреНрд░рддрд┐ рдХреЙрд▓ 12.9996 рд╕реАрдкреАрдпреВ рдЪрдХреНрд░ рд▓реЗрддрд╛ рд╣реИ

$ LD_LIBRARY_PATH =ред ./main3

рдЕрд╕рддреНрдп 13 рд╕реАрдкреАрдпреВ рдЪрдХреНрд░ рдкреНрд░рддрд┐ рдХреЙрд▓ рд▓реЗрддрд╛ рд╣реИ

рд╡рд┐рдХрд▓реНрдк 1 рд╡рд┐рдХрд▓реНрдк 2 рд╡рд┐рдХрд▓реНрдк 3
AMD Opteron (32 рдмрд┐рдЯ): 28.13 рд╕реАрдкреАрдпреВ рдЪрдХреНрд░ 15 рд╕реАрдкреАрдпреВ рд╕рд╛рдЗрдХрд┐рд▓ 16 рд╕реАрдкреАрдпреВ рд╕реАрдкреАрдпреВ рдЪрдХреНрд░
AMD Opteron (64 рдмрд┐рдЯ): 30.83 рд╕реАрдкреАрдпреВ рдЪрдХреНрд░ 10 рд╕реАрдкреАрдпреВ рд╕рд╛рдЗрдХрд┐рд▓ 11 рд╕реАрдкреАрдпреВ рд╕реАрдкреАрдпреВ рдЪрдХреНрд░
рдЗрдВрдЯреЗрд▓ рдХреЛрд░ 2 (32 рдмрд┐рдЯ): 44.67 рд╕реАрдкреАрдпреВ рд╕рд╛рдЗрдХрд┐рд▓ 13 рд╕реАрдкреАрдпреВ рд╕рд╛рдЗрдХрд┐рд▓ 13 рд╕реАрдкреАрдпреВ рд╕реАрдкреАрдпреВ рдЪрдХреНрд░
рдЗрдВрдЯреЗрд▓ рдХреЛрд░ 2 (64 рдмрд┐рдЯ): 39.37 рд╕реАрдкреАрдпреВ рдЪрдХреНрд░ 9 рд╕реАрдкреАрдпреВ рд╕рд╛рдЗрдХрд┐рд▓ 10 рд╕реАрдкреАрдпреВ рд╕реАрдкреАрдпреВ рдЪрдХреНрд░
рдЗрдВрдЯреЗрд▓ рдкреЗрдВрдЯрд┐рдпрдо рдбреА (32 рдмрд┐рдЯ): 111.34 рд╕реАрдкреАрдпреВ рд╕рд╛рдЗрдХрд┐рд▓ 26 рд╕реАрдкреАрдпреВ рд╕рд╛рдЗрдХрд┐рд▓ 26 рд╕реАрдкреАрдпреВ рд╕реАрдкреАрдпреВ рдЪрдХреНрд░
рдЗрдВрдЯреЗрд▓ рдкреЗрдВрдЯрд┐рдпрдо рдбреА (64 рдмрд┐рдЯ): 99.05 рд╕реАрдкреАрдпреВ рд╕рд╛рдЗрдХрд┐рд▓ 16 рд╕реАрдкреАрдпреВ рд╕рд╛рдЗрдХрд┐рд▓ 14 рд╕реАрдкреАрдпреВ рд╕реАрдкреАрдпреВ рдЪрдХреНрд░


рдкрд░рд┐рдгрд╛рдо рдЦреБрдж рдХреЗ рд▓рд┐рдП рдмреЛрд▓рддреЗ рд╣реИрдВ: рд╕реВрдЪреА рдореЗрдВ рд╕реЗ рдПрдХ рд╡рд┐рдХрд▓реНрдк рдХреЗ рд╕рд╛рде рд╡рд┐рдХрд▓реНрдк рд╢рд╛рдЦрд╛ рднрд╡рд┐рд╖реНрдпрд╡рдХреНрддрд╛ рдХреЗ рд╕рд╛рде рд╕рдВрдШрд░реНрд╖ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЗрд╕рд▓рд┐рдП рдмрд╣реБрдд рдзреАрдореА рдЧрддрд┐ рд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, "рдорд╛рдирдХ" рд╡рд┐рдХрд▓реНрдк, рдПрдХ рдирд┐рдпрдо рдХреЗ рд░реВрдк рдореЗрдВ, рд╕рдмрд╕реЗ рддреЗрдЬрд╝ рд╣реИ, рд▓реЗрдХрд┐рди "рдХрд┐рдлрд╛рдпрддреА" рд╕рдВрд╕реНрдХрд░рдг рдЖрдзреЗ рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдкреАрдЫреЗ рдирд╣реАрдВ рд░рд╣рддрд╛ рд╣реИ, рдФрд░ рд╡рд╣рд╛рдБ рдЬрд╣рд╛рдВ рдпрд╣ рдкрд┐рдЫрдбрд╝ рдЬрд╛рддрд╛ рд╣реИ, рдпрд╣ рдкреНрд░реЛрд╕реЗрд╕рд░ рдХрд╛ рдХреЗрд╡рд▓ рдПрдХ рдШрдбрд╝реА рдЪрдХреНрд░ рдЦреЛ рджреЗрддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдпрджрд┐ рдЖрдкрдХреЛ рдЗрд╕ рдлрд╝рдВрдХреНрд╢рди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ, рддреЛ рд╕рдмрд╕реЗ "рдЖрдВрддрд░рд┐рдХ" рдЪрдХреНрд░ рд╣реИ, рддреЛ рдпрд╣ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ (рдФрд░ рдЕрдЧрд░ рдмрд╣реБрдд рд╕рд╛рд░реА рд▓рд╛рдЗрдиреЗрдВ рд╣реИрдВ, рддреЛ рдЖрдкрдХреЛ рдЗрд╕рдХреА рд╕рд┐рдлрд╛рд░рд┐рд╢ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ)ред рдпрд╣ рджрд┐рд▓рдЪрд╕реНрдк рд╣реИ, рд╡реИрд╕реЗ, рд╡рд┐рдХрд▓реНрдкреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдореЗрдВ (рдЗрдВрдЯреЗрд▓ рдкреЗрдВрдЯрд┐рдпрдо рдбреА 64 рдмрд┐рдЯ) "рдХрд┐рдлрд╛рдпрддреА" рд╡рд┐рдХрд▓реНрдк рддреЗрдЬ рд╣реИ - рдЬреЛ рдЗрд╕ рддрдереНрдп рдХреЗ рдХрд╛рд░рдг рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рд╕рдВрднрд╛рд╡рдирд╛ рд╣реИ рдХрд┐ рдЗрд╕рдХреЗ рд▓рд┐рдП рдЖрдзреА рдореЗрдореЛрд░реА рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ рдФрд░ рдХреИрд╢ рддрдХ рдкрд╣реБрдВрдЪ рдХреА рдЧрддрд┐ рдЕрдВрддрд╣реАрди рд╣реИ ...



All Articles