рдХреЛрдИ рднреА рдмрдбрд╝рд╛ рдХрд╛рд░реНрдпрдХреНрд░рдо рдмрд┐рдирд╛ рдЕрд╕рд╛рдЗрдирдореЗрдВрдЯ рдХреЗ рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛ред рдкрд░реНрд▓ рдкреНрд░реЛрдЧреНрд░рд╛рдо (рдФрд░ рдХреЗрд╡рд▓ рдЙрд╕ рдкрд░ рдирд╣реАрдВ) рдореЗрдВ, рдбреЗрдЯрд╛ рдХреЛ рдЕрдХреНрд╕рд░ рд╣реИрд╢ рд╕рдВрд░рдЪрдирд╛рдУрдВ рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рдЗрди рд╣реИрд╢ рдХреЗ рдХреНрд╖реЗрддреНрд░реЛрдВ рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░рдирд╛ рдПрдХ рдмрд╣реБрдд рд╣реА рд╡рд┐рд╢рд┐рд╖реНрдЯ рдХрд╛рд░реНрдп рд╣реИред рдмреЗрд╢рдХ, рдкрд░реНрд▓ рдореЗрдВ рдЗрд╕рдХреЗ рд▓рд┐рдП рдХреЛрдб рд▓рд┐рдЦрдиреЗ рдХреЗ рдХрдИ рддрд░реАрдХреЗ рд╣реИрдВ - рдФрд░ рд╡реЗ рд╕рднреА рдкрдардиреАрдпрддрд╛ рдФрд░ рд╕реБрдВрджрд░рддрд╛ рдФрд░ рдЧрддрд┐ рдореЗрдВ рднрд┐рдиреНрди рд╣реИрдВред рдореБрдЭреЗ рдЖрд╢реНрдЪрд░реНрдп рд╣реИ рдХрд┐ рдпреЗ рдЕрдВрддрд░ рдХреНрдпрд╛ рдереЗ, рдФрд░ рдореИрдВрдиреЗ рдереЛрдбрд╝рд╛ рд╢реЛрдз рдХрд┐рдпрд╛ред
рдорд╛рди рд▓реАрдЬрд┐рдП рдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕
$hash
- рдХрдИ рдХреНрд╖реЗрддреНрд░реЛрдВ рдХреЗ рд╕рд╛рде рдПрдХ
$hash
рд▓рд┐рдВрдХ рд╣реИ, рдФрд░ рд╣рдо рдЙрдирдореЗрдВ рд╕реЗ рддреАрди рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред рдЗрд╕реЗ рд▓рд┐рдЦрдиреЗ рдХрд╛ рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рддрд░реАрдХрд╛:
<рдлрд╝реЙрдиреНрдЯ рд░рдВрдЧ = "рдЧреНрд░реЗ"> $ рд╣реИрд╢ -> {foo} = 456; $ рд╣реИрд╢ -> {рдмрд╛рд░} = $ рдмрд╛рд░; $ рд╣реИрд╢ -> {рдмрд╛рдЬ} = 'рдмрд╛рдЬ'; </ Font>
рдЖрдк рд╣реИрд╢ рд╕реНрд▓рд╛рдЗрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ - рдФрд░ рддреАрди рд╕реНрдХреЗрд▓рд░ рдЕрд╕рд╛рдЗрдирдореЗрдВрдЯ рдСрдкрд░реЗрдЯрд░реЛрдВ рдХреЗ рдмрдЬрд╛рдп, рдПрдХ рд╕реВрдЪреА рдЕрд╕рд╛рдЗрдирдореЗрдВрдЯ рдСрдкрд░реЗрдЯрд░ рдХреЗ рд╕рд╛рде рдПрдХ рд╣реА рдкреНрд░рднрд╛рд╡ рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ:
<рдлрд╝реЙрдиреНрдЯ рд░рдВрдЧ = "рдЧреНрд░реЗ"> @ $ рд╣реИрд╢ {qw (рдлреВ рдмрд╛рд░ рдмрд╛рдЬ)) = (456, $ рдмрд╛рд░, 'рдмрд╛рдЬ'); </ Font>
рдЖрдк рдмрд╕ рд╣реИрд╢ рдЕрд╕рд╛рдЗрди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ (
%$hash
рдЕрдВрджрд░ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдХреЗ рддрд╛рдХрд┐ рдЕрдиреНрдп рдлрд╝реАрд▓реНрдб рд╕рд╣реЗрдЬреЗ рдЬрд╛рдПрдВ):
<рдлрд╝реЙрдиреНрдЯ рд░рдВрдЧ = "рдЧреНрд░реЗ">% $ рд╣реИрд╢ = (% $ рд╣реИрд╢, рдлреВ => 456, рдмрд╛рд░ => $ рдмрд╛рд░, рдмрд╛рдЬ => 'рдмрд╛рдЬ'); </ Font>
рдЕрдВрдд рдореЗрдВ, рдЖрдк рд▓реВрдк рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ (рдпрд╣ рдЕрдХреНрд╕рд░ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реЛрддрд╛ рд╣реИ):
<font color = "grey"> my% h = (foo => 456, bar => $ bar, baz => 'baz'); $ рд╣реИрд╢ -> {$ _} = $ h {$ _} qw (рдлреВ рдмрд╛рд░ рдмрд╛рдЬ) рдХреЗ рд▓рд┐рдП; </ Font>
рдпрд╛ рдорд╛рдирдЪрд┐рддреНрд░ рдирд┐рд░реНрдорд╛рдг рдХреЗ рд░реВрдк рдореЗрдВ рдПрдХ рд╣реА рдмрд╛рдд рд▓рд┐рдЦреЗрдВ:
<font color = "рдЧреНрд░реЗ"> рдирдХреНрд╢рд╛ {$ рд╣реИрд╢ -> {$ _} = $ h {$ _}} qw (рдлреВ рдмрд╛рд░ рдмрд╛рдЬ); </ Font>
рдЖрдкрдХреЛ рдХреНрдпрд╛ рд▓рдЧрддрд╛ рд╣реИ рд╕рдмрд╕реЗ рддреЗрдЬрд╝ рддрд░реАрдХрд╛ рд╣реИ? рдПрдХ рдкрд░реАрдХреНрд╖рдг рдЪрд▓рд╛рдПрдВ рдЬреЛ рд╣реИрд╢ рдлрд╝реАрд▓реНрдб рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░рдиреЗ рдХреЗ рд╡рд┐рднрд┐рдиреНрди рддрд░реАрдХреЛрдВ рдХреА рдирд┐рд╖реНрдкрд╛рджрди рдЧрддрд┐ рдХреА рддреБрд▓рдирд╛ рдХрд░рддрд╛ рд╣реИ:
<рдлрд╝реЙрдиреНрдЯ рд░рдВрдЧ = "рдЧреНрд░реЗ"> #! / usr / рдмрд┐рди / рдкрд░реНрд▓ рд╕рдЦреНрдд рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ; рдмреЗрдВрдЪрдорд╛рд░реНрдХ qw (cmpthese) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ; рдореЗрд░реА $ рд╣реИрд╢ = { foo => 'foo', рдмрд╛рд░ => 123, рдмрд╛рдЬ => рдЕрдкрд░рд╛рдЬрд┐рдд, }; рдореЗрд░реЗ $ рдмрд╛рд░ = 'рдмрд╛рд░'; Cmpthese ( -10, { h_direct => рдЙрдк { $ рд╣реИрд╢ -> {foo} = 456; $ рд╣реИрд╢ -> {рдмрд╛рд░} = $ рдмрд╛рд░; $ рд╣реИрд╢ -> {рдмрд╛рдЬ} = 'рдмрд╛рдЬ'; } h_list => рдЙрдк { @ $ рд╣реИрд╢ {qw (рдлреВ рдмрд╛рд░ рдмрд╛рдЬ)} = (456, $ рдмрд╛рд░, 'рдмрд╛рдЬ'); } h_hash => рдЙрдк { % $ рд╣реИрд╢ = (% $ рд╣реИрд╢, рдлреВ => рекрелрем, рдмрд╛рд░ => $ рдмрд╛рд░, рдмрд╛рдЬ => 'рдмрд╛рдЬ); } h_for => рдЙрдк { my% h = (foo => 456, bar => $ bar, baz => 'baz'); $ рд╣реИрд╢ -> {$ _} = $ h {$ _} qw (рдлреВ рдмрд╛рд░ рдмрд╛рдЬ) рдХреЗ рд▓рд┐рдП; } h_forref => рдЙрдк { my $ h = {foo => 456, bar => $ bar, baz => 'baz'}; $ рд╣реИрд╢ -> {$ _} = $ h -> {$ _} qw (рдлреВ рдмрд╛рд░ рдмрд╛рдЬ) рдХреЗ рд▓рд┐рдП; } h_map => рдЙрдк { my% h = (foo => 456, bar => $ bar, baz => 'baz'); рдирдХреНрд╢рд╛ {$ рд╣реИрд╢ -> {$ _} = $ h {$ _}} qw (рдлреВ рдмрд╛рд░ рдмрд╛рдЬ); } h_mapref => рдЙрдк { my $ h = {foo => 456, bar => $ bar, baz => 'baz'}; рдирдХреНрд╢рд╛ {$ рд╣реИрд╢ -> {$ _} = $ h -> {$ _}} qw (рдлреВ рдмрд╛рд░ рдмрд╛рдЬ); } }); </ Font>
рдпрд╣рд╛рдБ рдЗрд╕рдХреЗ рдкрд░рд┐рдгрд╛рдо рд╣реИрдВ:
рджрд░ h_hash h_forref h_mapref h_for h_map h_list h_direct h_hash 100913 / s - -30% -42% -43% -53% -80% -91% h_forref 144297 / s 43% - -17% -19% -32% -71% -88% h_mapref 174524 / s 73% 21% - -2% -18% -65% -85% h_for 177449 тАЛтАЛ/ s 76% 23% 2% - -17% -65% -85% h_map 213368 / s 111% 48% 22% 20% - -58% -82% h_list 505768 / s 401% 251% 190% 185% 137% - -57% h_direct 1169409 / s 1059% 710% 570% 559% 448% 131% -
рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рд╕рдмрд╕реЗ рддреЗрдЬрд╝ рддрд░реАрдХрд╛ рдкреНрд░рддреНрдпрдХреНрд╖ рдЕрд╕рд╛рдЗрдирдореЗрдВрдЯ рд╣реИред рд╣реИрд╢ рд╕реНрд▓рд╛рдЗрд╕ рджреЛ рдмрд╛рд░ рдзреАрдореА рдЧрддрд┐ рд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рдПрдХ рдЪрдХреНрд░ рдХреЗ рд╕рд╛рде рдбрд┐рдЬрд╛рдЗрди - рдПрдХ рдФрд░ 2-3 рдмрд╛рд░ рдзреАрдорд╛ред рдореИрдк рд▓реВрдк рдЗрд╕рдХреЗ рд▓рд┐рдП рд╕рдВрдмрдВрдзрд┐рдд рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдереЛрдбрд╝рд╛ рддреЗрдЬ рд╣реИред
рд╣рд╛рд▓рд╛рдВрдХрд┐, рдбреЗрдЯрд╛ рди рдХреЗрд╡рд▓ рд╣реИрд╢ рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдмрд▓реНрдХрд┐ рд╕рд░рдгрд┐рдпреЛрдВ рдореЗрдВ рднреАред рдПрдХ рд╕рд░рдгреА рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рдорд╛рди рдкрд░реАрдХреНрд╖рдг рд╕рдорд╛рди рдкрд░рд┐рдгрд╛рдо рджреЗрддрд╛ рд╣реИ:
<рдлрд╝реЙрдиреНрдЯ рд░рдВрдЧ = "рдЧреНрд░реЗ"> #! / usr / рдмрд┐рди / рдкрд░реНрд▓ рд╕рдЦреНрдд рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ; рдмреЗрдВрдЪрдорд╛рд░реНрдХ qw (cmpthese) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ; рдореЗрд░реА $ рд╕реВрдЪреА = ['рдлреВ', 123, рдЕрдкрд╡рд┐рддреНрд░]; рдореЗрд░реЗ $ рдмрд╛рд░ = 'рдмрд╛рд░'; Cmpthese ( -10, { l_direct => рдЙрдк { $ рд╕реВрдЪреА -> [0] = 456; $ рд╕реВрдЪреА -> [1] = $ рдмрд╛рд░; $ рд╕реВрдЪреА -> [2] = 'рдмрд╛рдЬ'; } l_list => рдЙрдк { @ $ рд╕реВрдЪреА [0 .. 2] = (456, $ рдмрд╛рд░, 'рдмрд╛рдЬ'); } l_for => рдЙрдк { my @l = (456, $ рдмрд╛рд░, 'рдмрд╛рдЬ'); $ рд╕реВрдЪреА -> [$ _] = $ l [$ _] 0 .. 2 рдХреЗ рд▓рд┐рдП; } l_forref => рдЙрдк { рдореЗрд░реЗ $ l = [456, $ рдмрд╛рд░, 'рдмрд╛рдЬ']; $ рд╕реВрдЪреА -> [$ _] = $ l -> [$ _] реж рдХреЗ рд▓рд┐рдП .. реи; } l_map => рдЙрдк { my @l = (456, $ рдмрд╛рд░, 'рдмрд╛рдЬ'); рдирдХреНрд╢рд╛ {$ рд╕реВрдЪреА -> [$ _] = $ l [$ _]} 0 .. 2; } l_mapref => рдЙрдк { рдореЗрд░реЗ $ l = [456, $ рдмрд╛рд░, 'рдмрд╛рдЬ']; рдирдХреНрд╢рд╛ {$ рд╕реВрдЪреА -> [$ _] = $ l -> [$ _]} 0 .. 2; } }); </ Font>
рджрд░ l_forref l_for l_mapref l_map l_list l_direct l_forref 197498 / s - -11% -17% -38% -65% -86% l_for 222737 / s 13% - -6% -30% -60% -84% l_mapref 237429 / s 20% 7% - -25% -58% -83% l_map 318127 / s 61% 43% 34% - -43% -77% l_list 559192 / s 183% 151% 136% 76% - -60% l_direct 1395278 / s 606% 526% 488% 339% 150% -
рддреАрди рдорд╢реАрдиреЛрдВ (рд╡рд┐рдВрдбреЛрдЬ рдПрдХреНрд╕рдкреА рдХреЗ рддрд╣рдд рдбреЗрд╕реНрдХрдЯреЙрдк рдФрд░ рдлреНрд░реАрдмреАрдПрд╕рдбреА рдХреЗ рддрд╣рдд рджреЛ рд╕рд░реНрд╡рд░) рдкрд░ рдкрд░реНрд▓ 5.8.8 рдХреЗ рд▓рд┐рдП рддреБрд▓рдирд╛ рдХреА рдЧрдИ рдереАред рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╕рдВрдЦреНрдпрд╛рдПрдВ рдмрджрд▓рддреА рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЕрдиреБрдкрд╛рдд рд╣рд░ рдЬрдЧрд╣ рд╕рдорд╛рди рд╣реИред
PS <pre> рдореЗрдВ рд▓рд┐рдкрдЯрд╛ рдХреЛрдб рдпрд╣рд╛рдВ рдХрд┐рд╕реА рддрд░рд╣ рдмрджрд╕реВрд░рдд рджрд┐рдЦрддрд╛ рд╣реИред рдХреНрдпрд╛ рдЗрд╕реЗ рдкреНрд░реАрддрд┐рдХрд░ рдмрдирд╛рдиреЗ рдХрд╛ рдХреЛрдИ рддрд░реАрдХрд╛ рд╣реИ?