PHP рдореЗрдВ рд╕рд░рдгрд┐рдпрд╛рдБ (рдФрд░ рдорд╛рди) рдХрд┐рддрдиреА рдмрдбрд╝реА рд╣реИрдВ? (рд╕рдВрдХреЗрдд: рдмрд╣реБрдд рдмрдбрд╝рд╛)

рдЗрд╕ рдЕрдиреБрдЪреНрдЫреЗрдж рдореЗрдВ, рдореИрдВ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ PHP рдореЗрдВ рд╕рд░рдгрд┐рдпреЛрдВ (рдФрд░ рд╕рд╛рдорд╛рдиреНрдп рд░реВрдк рд╕реЗ рдореВрд▓реНрдпреЛрдВ) рдХреА рдореЗрдореЛрд░реА рдЦрдкрдд рдХреА рдЬрд╛рдВрдЪ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ, рдЬреЛ рд╕рд░рдгреА рдХреЗ 100,000 рдЕрджреНрд╡рд┐рддреАрдп рдкреВрд░реНрдгрд╛рдВрдХ рддрддреНрд╡реЛрдВ рдХреЛ рдмрдирд╛рддрд╛ рд╣реИ рдФрд░ рдЕрдВрдд рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХреА рдЬрд╛рдиреЗ рд╡рд╛рд▓реА рд╕реНрдореГрддрд┐ рдХреА рдорд╛рддреНрд░рд╛ рдХреЛ рдорд╛рдкрддрд╛ рд╣реИред

рдпрд╣ рдПрдХ рдЕрдиреБрд╡рд╛рдж рд╣реИ (рдореЗрд░реЗ рдЬреИрд╕реЗ рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдЬреЛ рдЕрдХреНрд╕рд░ рдЗрд╕реЗ рдиреЛрдЯрд┐рд╕ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ)ред

рд╢реБрд░реБрдЖрдд рдореЗрдВ рдореИрдВ рдЬреЛрд╣рд╛рдиреНрд╕ рдФрд░ рдЯрд╛рдпрд░реЗрд▓ рдХреЛ рд╕реНрдореГрддрд┐ рдЙрдкрднреЛрдЧ рдХреЗ рд▓рд┐рдП рдЫрд┐рдкреЗ рд╣реБрдП рд╕реНрдерд╛рдиреЛрдВ рдХреЛ рдЦреЛрдЬрдиреЗ рдореЗрдВ рдЙрдирдХреА рдорджрдж рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж рджреЗрдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВред

<?php $startMemory = memory_get_usage(); $array = range(1, 100000); echo memory_get_usage() - $startMemory, ' bytes'; 


рдЖрдкрдХреЛ рдХреНрдпрд╛ рд▓рдЧрддрд╛ рд╣реИ рдХреНрдпрд╛ рдирд┐рдХрд▓реЗрдЧрд╛? рдпрджрд┐ рдкреВрд░реНрдгрд╛рдВрдХ 8 рдмрд╛рдЗрдЯреНрд╕ рд╣реИрдВ (64 рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░ рдкрд░ рдФрд░ рд▓рдВрдмреЗ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ) рдФрд░ 100,000 рдкреВрд░реНрдгрд╛рдВрдХ рд╣реИрдВ, рддреЛ рдЬрд╛рд╣рд┐рд░ рд╣реИ, 800,000 рдмрд╛рдЗрдЯ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреАред рдпрд╣ рд▓рдЧрднрдЧ 0.76 рдПрдордмреА рд╣реИред

рдЕрдм рдХреЛрдб рдХреЛ рдЪрд▓рд╛рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВред рдЗрд╕реЗ рдСрди-рд▓рд╛рдЗрди рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдкрд░рд┐рдгрд╛рдо 14,649,024 рдмрд╛рдЗрдЯреНрд╕ рд╣реИред рдЬреА рд╣рд╛рдБ, рдЖрдкрдиреЗ рд╕рд╣реА рд╕реБрдирд╛, рдпрд╣ 13.97 MB - 18 рдЧреБрдирд╛ рдЕрдзрд┐рдХ рд╣реИ рдЬреЛ рд╣рдордиреЗ рд╕реЛрдЪрд╛ рд╣реИред

рддреЛ, рдпрд╣ 18 рдЧреБрдирд╛ рд╡реГрджреНрдзрд┐ рдХрд╣рд╛рдВ рд╕реЗ рдЖрдИ?

рд╕рд╛рд░рд╛рдВрд╢



рдЬреЛ рд▓реЛрдЧ рдЗрд╕ рд╕рдм рд╕реЗ рдирд┐рдкрдЯрдирд╛ рдирд╣реАрдВ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рдЙрдирдХреЗ рд▓рд┐рдП рдпрд╣рд╛рдВ рд╢рд╛рдорд┐рд▓ рдШрдЯрдХреЛрдВ рдХрд╛ рд╕рдВрдХреНрд╖рд┐рдкреНрдд рд╡рд┐рд╡рд░рдг рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред

  | 64 bit | 32 bit --------------------------------------------------- zval | 24 bytes | 16 bytes + cyclic GC info | 8 bytes | 4 bytes + allocation header | 16 bytes | 8 bytes =================================================== zval (value) total | 48 bytes | 28 bytes =================================================== bucket | 72 bytes | 36 bytes + allocation header | 16 bytes | 8 bytes + pointer | 8 bytes | 4 bytes =================================================== bucket (array element) total | 96 bytes | 48 bytes =================================================== total total | 144 bytes | 76 bytes 


рдЖрдкрдХреЗ рдСрдкрд░реЗрдЯрд┐рдВрдЧ рд╕рд┐рд╕реНрдЯрдо, рдХрдВрдкрд╛рдЗрд▓рд░ рдФрд░ рд╕рдВрдХрд▓рди рд╡рд┐рдХрд▓реНрдкреЛрдВ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдЙрдкрд░реЛрдХреНрдд рд╕рдВрдЦреНрдпрд╛ рднрд┐рдиреНрди рд╣реЛ рд╕рдХрддреА рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрджрд┐ рдЖрдк PHP рдХреЛ рдбреАрдмрдЧ рдпрд╛ рдереНрд░реЗрдб-рд╕реБрд░рдХреНрд╖рд╛ рдХреЗ рд╕рд╛рде рд╕рдВрдХрд▓рд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЖрдкрдХреЛ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдорд╛рди рдорд┐рд▓реЗрдВрдЧреЗред рд▓реЗрдХрд┐рди рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЖрдк 64-рдмрд┐рдЯ рд▓рд┐рдирдХреНрд╕ рдкрд░ PHP 5.3 рдХреА рд╕рд╛рдзрд╛рд░рдг рдЕрд╕реЗрдВрдмрд▓реА рдкрд░ рджрд┐рдП рдЧрдП рдЖрдХрд╛рд░ рджреЗрдЦреЗрдВрдЧреЗред

рдпрджрд┐ рдЖрдк рдЗрди резрекрек рдмрд╛рдЗрдЯреНрд╕ рдХреЛ рд╣рдорд╛рд░реЗ резрежреж,режрежреж рдирдВрдмрд░реЛрдВ рд╕реЗ рдЧреБрдгрд╛ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЖрдкрдХреЛ резрек,рекрежреж,режрежреж рдмрд╛рдЗрдЯреНрд╕ рдорд┐рд▓рддреЗ рд╣реИрдВ, рдЬреЛ рдХрд┐ резрей.3рей рдПрдордмреА рд╣реИред рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдкрд░рд┐рдгрд╛рдо рдХреЗ рдмрд╣реБрдд рдХрд░реАрдм, рдмрд╛рдХреА рдЬреНрдпрд╛рджрд╛рддрд░ рдЕрдирдЗрдВрд╕реНрдЯрд╛рд▓реНрдпреВрдЯреЗрдб рдмреНрд▓реЙрдХ (рдмрд╛рд▓реНрдЯреА) рдХреЗ рд▓рд┐рдП рд╕рдВрдХреЗрдд рд╣реИрдВ, рд▓реЗрдХрд┐рди рдореИрдВ рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдж рдореЗрдВ рдмрд╛рдд рдХрд░реВрдВрдЧрд╛ред

рдЕрдм, рдпрджрд┐ рдЖрдк рдКрдкрд░ рджрд┐рдП рдЧрдП рдорд╛рдиреЛрдВ рдХрд╛ рдЕрдзрд┐рдХ рд╡рд┐рд╕реНрддреГрдд рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ :) рдкрд░ рдкрдврд╝реЗрдВред

рд╕рдВрдШ zvalue_value



рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдЖрдЗрдП рдПрдХ рдирдЬрд░ рдбрд╛рд▓рддреЗ рд╣реИрдВ рдХрд┐ PHP рдХреИрд╕реЗ рдореВрд▓реНрдпреЛрдВ рдХреЛ рд╕реНрдЯреЛрд░ рдХрд░рддрд╛ рд╣реИред рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рдЬрд╛рдирддреЗ рд╣реИрдВ, PHP рдПрдХ рдХрдордЬреЛрд░ рдЯрд╛рдЗрдк рдХреА рднрд╛рд╖рд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЗрд╕реЗ рдореВрд▓реНрдпреЛрдВ рдХреЗ рдмреАрдЪ рдЬрд▓реНрджреА рд╕реЗ рд╕реНрд╡рд┐рдЪ рдХрд░рдиреЗ рдХрд╛ рдПрдХ рддрд░реАрдХрд╛ рдЪрд╛рд╣рд┐рдПред PHP рдПрдХ рд╕рдВрдШ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ, рдЬрд┐рд╕реЗ zend.h # 307 (рдореЗрд░реА рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ) рдХреЗ рд░реВрдк рдореЗрдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ:

 typedef union _zvalue_value { long lval; //     double dval; //      struct { //   char *val; //      int len; //    } str; HashTable *ht; //   (-) zend_object_value obj; //   } zvalue_value; 


рдпрджрд┐ рдЖрдк рд╕реА рдирд╣реАрдВ рдЬрд╛рдирддреЗ рд╣реИрдВ, рддреЛ рдпрд╣ рдХреЛрдИ рд╕рдорд╕реНрдпрд╛ рдирд╣реАрдВ рд╣реИ - рдХреЛрдб рдмрд╣реБрдд рд╕рд░рд▓ рд╣реИ: рд╕рдВрдШ рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдореВрд▓реНрдп рд╡рд┐рднрд┐рдиреНрди рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд░реВрдк рдореЗрдВ рдХрд╛рд░реНрдп рдХрд░ рд╕рдХрддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрджрд┐ рдЖрдк zvalue_value-> lval рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдорд╛рди рдХреЛ рдкреВрд░реНрдгрд╛рдВрдХ рдХреЗ рд░реВрдк рдореЗрдВ рд╕рдордЭрд╛ рдЬрд╛рдПрдЧрд╛ред рджреВрд╕рд░реА рдУрд░, рдпрджрд┐ рдЖрдк zvalue_value-> ht рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдорд╛рди рдХреЛ рдПрдХ рд╣реИрд╢ рдЯреЗрдмрд▓ (рдЙрд░реНрдл рд╕рд░рдгреА) рдХреЗ рд▓рд┐рдП рд╕реВрдЪрдХ рдХреЗ рд░реВрдк рдореЗрдВ рд╡реНрдпрд╛рдЦреНрдпрд╛ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред

рд╣рдо рдЗрд╕ рдкрд░ рдирд╣реАрдВ рдЭреБрдХреЗрдВрдЧреЗред рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдорд╣рддреНрд╡рдкреВрд░реНрдг рдмрд╛рдд рдпрд╣ рд╣реИ рдХрд┐ рд╕рдВрдШ рдХрд╛ рдЖрдХрд╛рд░ рдЙрд╕рдХреЗ рд╕рдмрд╕реЗ рдмрдбрд╝реЗ рдШрдЯрдХ рдХреЗ рдЖрдХрд╛рд░ рдХреЗ рдмрд░рд╛рдмрд░ рд╣реИред рд╕рдмрд╕реЗ рдмрдбрд╝рд╛ рдШрдЯрдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ рд╣реИ (рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, zend_object_value рд╕рдВрд░рдЪрдирд╛ рднреА рдЖрдХрд╛рд░ рд╣реИ, рд▓реЗрдХрд┐рди рдореИрдВ рдЗрд╕ рдмрд┐рдВрджреБ рдХреЛ рд╕рд░рд▓рддрд╛ рдХреЗ рд▓рд┐рдП рдЫреЛрдбрд╝ рджреВрдВрдЧрд╛)ред рд╕рдВрд░рдЪрдирд╛ рдореЗрдВ рдПрдХ рд╕реВрдЪрдХ (8 рдмрд╛рдЗрдЯреНрд╕) рдФрд░ рдПрдХ рдкреВрд░реНрдгрд╛рдВрдХ (4 рдмрд╛рдЗрдЯреНрд╕) рд╣реЛрддреЗ рд╣реИрдВред рдХреБрд▓ 12 рдмрд╛рдЗрдЯреНрд╕ред рдореЗрдореЛрд░реА рд╕рдВрд░реЗрдЦрдг рдХреЗ рдХрд╛рд░рдг (12 рдмрд╛рдЗрдЯреНрд╕ рдХреА рд╕рдВрд░рдЪрдирд╛рдПрдВ рд╢рд╛рдВрдд рдирд╣реАрдВ рд╣реЛрддреА рд╣реИрдВ, рдХреНрдпреЛрдВрдХрд┐ рд╡реЗ 64 рдмрд┐рдЯреНрд╕ / 8 рдмрд╛рдЗрдЯреНрд╕ рдХрд╛ рдЙрддреНрдкрд╛рдж рдирд╣реАрдВ рд╣реИрдВ), рд╕рдВрд░рдЪрдирд╛ рдХрд╛ рдЕрдВрддрд┐рдо рдЖрдХрд╛рд░ 16 рдмрд╛рдЗрдЯреНрд╕ рд╣реЛрдЧрд╛ рдФрд░ рддрджрдиреБрд╕рд╛рд░, рдкреВрд░реЗ рд╕рдВрдШ рдХреЗ рд░реВрдк рдореЗрдВред

рддреЛ, рдЕрдм рд╣рдо рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рд╣рдореЗрдВ рдкреНрд░рддреНрдпреЗрдХ рдореВрд▓реНрдп рдХреЗ рд▓рд┐рдП 8 рдмрд╛рдЗрдЯреНрд╕ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди 16 - PHP рдХреЗ рдЧрддрд┐рд╢реАрд▓ рдЯрд╛рдЗрдкрд┐рдВрдЧ рдХреЗ рдХрд╛рд░рдгред 100,000 рд╕реЗ рдЧреБрдгрд╛ рдХрд░рдиреЗ рдкрд░ рд╣рдореЗрдВ 1,600,000 рдмрд╛рдЗрдЯреНрд╕ рдорд┐рд▓рддреЗ рд╣реИрдВ, рдЕрд░реНрдерд╛рддреНред 1.53 рдПрдордмреАред рд▓реЗрдХрд┐рди рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдорд╛рддреНрд░рд╛ 13.97 рдПрдордмреА рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╣рдо рдЕрднреА рддрдХ рд▓рдХреНрд╖реНрдп рддрдХ рдирд╣реАрдВ рдкрд╣реБрдВрдЪреЗ рд╣реИрдВред

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



рдпрд╣ рддрд░реНрдХрд╕рдВрдЧрдд рд╣реИ рдХрд┐ рд╕рдВрдШ рдХреЗрд╡рд▓ рдореВрд▓реНрдп рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рддрд╛ рд╣реИ, рдФрд░ PHP, рдЬрд╛рд╣рд┐рд░ рд╣реИ, рдЗрд╕рдХреЗ рдкреНрд░рдХрд╛рд░ рдФрд░ рдХрдЪрд░рд╛ рд╕рдВрдЧреНрд░рд╣ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рдЬрд╛рдирдХрд╛рд░реА рднреА рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдЬрд┐рд╕ рд╕рдВрд░рдЪрдирд╛ рдореЗрдВ рдпрд╣ рдЬрд╛рдирдХрд╛рд░реА рд╣реЛрддреА рд╣реИ рдЙрд╕реЗ zval рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдЖрдкрдиреЗ рд╢рд╛рдпрдж рд╣реА рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реБрдирд╛ рд╣реЛред рдпрд╣ рдкреАрдПрдЪрдкреА рдХреНрдпреЛрдВ рд╣реИ, рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдзрд┐рдХ рдЬрд╛рдирдХрд╛рд░реА рдХреЗ рд▓рд┐рдП, рдореИрдВ рд╕рд╛рд░рд╛ рдЧреЙрд▓рдореЛрди рдХреЗ рд▓реЗрдЦ рдХреЛ рдкрдврд╝рдиреЗ рдХреА рд╕рд▓рд╛рд╣ рджреЗрддрд╛ рд╣реВрдВред рдЬреИрд╕рд╛ рдХрд┐ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдЗрд╕ рд╕рдВрд░рдЪрдирд╛ рдХреЛ рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ :

 struct _zval_struct { zvalue_value value; //  zend_uint refcount__gc; //     ( GC) zend_uchar type; //  zend_uchar is_ref__gc; //      (&) }; 


рд╕рдВрд░рдЪрдирд╛ рдХрд╛ рдЖрдХрд╛рд░ рдЙрд╕рдХреЗ рд╕рднреА рдШрдЯрдХреЛрдВ рдХреЗ рдЖрдХрд╛рд░ рдХреЗ рдпреЛрдЧ рд╕реЗ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рд╣реЛрддрд╛ рд╣реИ: zvalue_value - 16 рдмрд╛рдЗрдЯреНрд╕ (рдКрдкрд░ рдХреА рдЧрдгрдирд╛), zend_uint - 4 рдмрд╛рдЗрдЯреНрд╕, zend_uchar - 1 рдмрд╛рдЗрдЯ рдкреНрд░рддреНрдпреЗрдХред рдХреБрд▓ 22 рдмрд╛рдЗрдЯреНрд╕ред рдлрд┐рд░ рд╕реЗ, рдореЗрдореЛрд░реА рд╕рдВрд░реЗрдЦрдг рдХреЗ рдХрд╛рд░рдг, рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдЖрдХрд╛рд░ 24 рдмрд╛рдЗрдЯреНрд╕ рд╣реЛрдЧрд╛ред

рдЗрд╕рд▓рд┐рдП, рдпрджрд┐ рд╣рдо 24 рдмрд╛рдЗрдЯреНрд╕ рдХреЗ 100,000 рдорд╛рдиреЛрдВ рдХреЛ рд╕реНрдЯреЛрд░ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдпрд╣ 2,400,000 рдмрд╛рдЗрдЯреНрд╕, рдпрд╛ 2.29 рдПрдордмреА рд╣реЛрдЧрд╛ред рдЕрдВрддрд░ рдХрдо рд╣реЛ рд░рд╣рд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдореВрд▓реНрдп рдЫрд╣ рдЧреБрдирд╛ рдмрдбрд╝рд╛ рд╣реИред

рдкрд░рд┐рдкрддреНрд░ рд╕рдВрджрд░реНрдн рдХреЗ рд▓рд┐рдП рдХрдЪрд░рд╛ рдХрд▓реЗрдХреНрдЯрд░ (PHP 5.3)



PHP 5.3 рдиреЗ рдкрд░рд┐рдкрддреНрд░ рд╕рдВрджрд░реНрдн рдХреЗ рд▓рд┐рдП рдПрдХ рдирдпрд╛ рдХрдЪрд░рд╛ рд╕рдВрдЧреНрд░рд╣рдХрд░реНрддрд╛ рдкреЗрд╢ рдХрд┐рдпрд╛ред рдЗрд╕рдХреЗ рд▓рд┐рдП, PHP рдХреБрдЫ рдЕрддрд┐рд░рд┐рдХреНрдд рдЬрд╛рдирдХрд╛рд░реА рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рддрд╛ рд╣реИред рдореИрдВ рдпрд╣рд╛рдВ рдпрд╣ рдирд╣реАрдВ рд╕рдордЭрд╛рдирд╛ рдЪрд╛рд╣рддрд╛ рдХрд┐ рдпрд╣ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рдЖрдк рдореИрдиреБрдЕрд▓ рд╕реЗ рдЖрд╡рд╢реНрдпрдХ рдЬрд╛рдирдХрд╛рд░реА рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рд╣рдорд╛рд░реЗ рдЖрдХрд╛рд░ рдХреА рдЧрдгрдирд╛ рдХреЗ рд▓рд┐рдП, рдпрд╣ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ рдХрд┐ рдкреНрд░рддреНрдпреЗрдХ zval рдЦреБрдж рдХреЛ zval_gc_info рд▓рдкреЗрдЯрддрд╛ рд╣реИ :

 typedef struct _zval_gc_info { zval z; union { gc_root_buffer *buffered; struct _zval_gc_info *next; } u; } zval_gc_info; 


рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, Zend рдХреЗрд╡рд▓ рдПрдХ рдпреВрдирд┐рдпрди рдЬреЛрдбрд╝рддрд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рджреЛ рдкреЙрдЗрдВрдЯрд░реНрд╕ рд╣реЛрддреЗ рд╣реИрдВред рдЬреИрд╕рд╛ рдХрд┐ рдЖрдкрдХреЛ рдпрд╛рдж рд╣реИ, рд╕рдВрдШ рдХрд╛ рдЖрдХрд╛рд░ рд╕рдмрд╕реЗ рдмрдбрд╝реЗ рдШрдЯрдХ рджреНрд╡рд╛рд░рд╛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рджреЛрдиреЛрдВ рдШрдЯрдХ 8 рдмрд╛рдЗрдЯреНрд╕ рдХреЗ рд╕рдВрдХреЗрдд рд╣реИрдВред рддрджрдиреБрд╕рд╛рд░, рд╕рдВрдШ рдХрд╛ рдЖрдХрд╛рд░ рднреА 8 рдмрд╛рдЗрдЯреНрд╕ рд╣реИред

рдпрджрд┐ рд╣рдо рдкреНрд░рд╛рдкреНрдд 24 рдмрд╛рдЗрдЯреНрд╕ рдХреЛ рдКрдкрд░ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ, рддреЛ рд╣рдореЗрдВ 32 рдмрд╛рдЗрдЯреНрд╕ рдорд┐рд▓рддреЗ рд╣реИрдВред рдЗрд╕реЗ 100,000 рд╕реЗ рдЧреБрдгрд╛ рдХрд░реЗрдВ рдФрд░ 3.05 рдПрдордмреА рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВред

ZEND рдореЗрдореЛрд░реА рдореИрдиреЗрдЬрд░



рд╕реА, PHP рдХреЗ рд╡рд┐рдкрд░реАрдд, рдЖрдкрдХреЗ рд▓рд┐рдП рдореЗрдореЛрд░реА рдХрд╛ рдкреНрд░рдмрдВрдзрди рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рдЖрдкрдХреЛ рдореЗрдореЛрд░реА рдЖрд╡рдВрдЯрди рдХреА рд╕реНрд╡рддрдВрддреНрд░ рд░реВрдк рд╕реЗ рдирд┐рдЧрд░рд╛рдиреА рдХрд░рдиреА рдЪрд╛рд╣рд┐рдПред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, PHP рдЕрдкрдиреА рдЬрд░реВрд░рддреЛрдВ рдХреЗ рд▓рд┐рдП рдЕрдиреБрдХреВрд▓рд┐рдд рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рдореЗрдореЛрд░реА рдореИрдиреЗрдЬрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ: Zend рдореЗрдореЛрд░реА рдореИрдиреЗрдЬрд░ ред MM Zend рдбрдЧ рд▓реЗ рдФрд░ рдЕрддрд┐рд░рд┐рдХреНрдд PHP- рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╕реБрд╡рд┐рдзрд╛рдУрдВ рдФрд░ рдЕрдиреБрдХреВрд▓рди (рдЬреИрд╕реЗ рдореЗрдореЛрд░реА рд╕реАрдорд╛, рдкреНрд░рддреНрдпреЗрдХ рдЕрдиреБрд░реЛрдз рдФрд░ рдмрд╛рдж рдХреА рддрд░рд╣ рд╕рдлрд╛рдИ) рдХреЗ рд╕рднреА рдкреНрд░рдХрд╛рд░ рд╕реЗ рдорд╛рд▓реЙрдХ рдкрд░ рдЖрдзрд╛рд░рд┐рдд рд╣реИред

рдЗрд╕рдореЗрдВ рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдорд╣рддреНрд╡рдкреВрд░реНрдг рдпрд╣ рд╣реИ рдХрд┐ рдПрдордПрдо рдкреНрд░рддреНрдпреЗрдХ рдореЗрдореЛрд░реА рдЖрд╡рдВрдЯрди рдХреЗ рд▓рд┐рдП рдПрдХ рд╣реЗрдбрд░ рдЬреЛрдбрд╝рддрд╛ рд╣реИ рдЬреЛ рдЗрд╕рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЧреБрдЬрд░рддрд╛ рд╣реИред рдФрд░ рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ :

 typedef struct _zend_mm_block { zend_mm_block_info info; #if ZEND_DEBUG unsigned int magic; # ifdef ZTS THREAD_T thread_id; # endif zend_mm_debug_info debug; #elif ZEND_MM_HEAP_PROTECTION zend_mm_debug_info debug; #endif } zend_mm_block; typedef struct _zend_mm_block_info { #if ZEND_MM_COOKIES size_t _cookie; #endif size_t _size; //   size_t _prev; //   (   ) } zend_mm_block_info; 


рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдкрд░рд┐рднрд╛рд╖рд╛ рдореЗрдВ рдХрдИ рд╕рдВрдХрд▓рди рд╡рд┐рдХрд▓реНрдк рдЪреЗрдХ рд╢рд╛рдорд┐рд▓ рд╣реИрдВред рдпрджрд┐ рдЗрди рд╡рд┐рдХрд▓реНрдкреЛрдВ рдореЗрдВ рд╕реЗ рдХрдо рд╕реЗ рдХрдо рдПрдХ рд╡рд┐рдХрд▓реНрдк рд╕рдХреНрд╖рдо рд╣реИ, рддреЛ рдЖрд╡рдВрдЯрд┐рдд рдореЗрдореЛрд░реА рдХреЗ рд▓рд┐рдП рд╣реЗрдбрд░ рдмрдбрд╝рд╛ рд╣реЛрдЧрд╛, рдФрд░ рдпрд╣ рд╕рдмрд╕реЗ рдмрдбрд╝рд╛ рд╣реЛрдЧрд╛ рдпрджрд┐ рдЖрдк рдвреЗрд░ рд╕реБрд░рдХреНрд╖рд╛, рдереНрд░реЗрдб рд╕реБрд░рдХреНрд╖рд╛, рдбреАрдмрдЧрд┐рдВрдЧ рдФрд░ рдПрдордПрдо рдХреБрдХреАрдЬрд╝ рдХреЗ рд╕рд╛рде PHP рд╕рдВрдХрд▓рд┐рдд рдХрд░рддреЗ рд╣реИрдВред

рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╣рдо рдорд╛рдиреЗрдВрдЧреЗ рдХрд┐ рдпреЗ рд╕рднреА рд╡рд┐рдХрд▓реНрдк рдЕрдХреНрд╖рдо рд╣реИрдВред рдЗрд╕ рд╕реНрдерд┐рддрд┐ рдореЗрдВ, рдХреЗрд╡рд▓ рджреЛ рдШрдЯрдХ size_t _size рдФрд░ _prev рдмрдиреЗ рд░рд╣рддреЗ рд╣реИрдВ ред size_t рдореЗрдВ 8 рдмрд╛рдЗрдЯреНрд╕ (64 рдмрд┐рдЯреНрд╕) рд╣реЛрддреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рд╣реЗрдбрд░ рдХрд╛ рдЖрдХрд╛рд░ 16 рдмрд╛рдЗрдЯреНрд╕ рд╣реЛрддрд╛ рд╣реИ - рдФрд░ рдпрд╣ рд╣реЗрдбрд░ рдЖрдкрдХреЗ рдореЗрдореЛрд░реА рдЖрд╡рдВрдЯрди рдХреЗ рд▓рд┐рдП рдЬреЛрдбрд╝рд╛ рдЬрд╛рддрд╛ рд╣реИред

рдЗрд╕рд▓рд┐рдП рд╣рдореЗрдВ рдЬрд╝рд╡рд▓ рдЖрдХрд╛рд░ рдХреЛ рдлрд┐рд░ рд╕реЗ рд╕рдорд╛рдпреЛрдЬрд┐рдд рдХрд░рдирд╛ рд╣реЛрдЧрд╛ ред рджрд░рдЕрд╕рд▓ рдпрд╣ рд╣реЗрдбрд░ рдХреЗ рдХрд╛рд░рдг 32 рдмрд╛рдЗрдЯреНрд╕ рдирд╣реАрдВ, рдмрд▓реНрдХрд┐ 48 рд╣реЛрдВрдЧреЗред рд╣рдо рдЕрдкрдиреЗ 100,000 рддрддреНрд╡реЛрдВ рд╕реЗ рдЧреБрдгрд╛ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ 4,58 рдПрдордмреА рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВред рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдЖрдХрд╛рд░ 13.97 рдПрдордмреА рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╣рдордиреЗ рдкрд╣рд▓реЗ рд╣реА рд▓рдЧрднрдЧ рдПрдХ рддрд┐рд╣рд╛рдИ рдХрд╡рд░ рдХрд┐рдпрд╛ рд╣реИред

рдмреНрд▓реЙрдХ



рдЕрдм рддрдХ, рд╣рдордиреЗ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдореВрд▓реНрдпреЛрдВ рдХреЛ рджреЗрдЦрд╛ рд╣реИред рд▓реЗрдХрд┐рди PHP рдореЗрдВ рд╕рд░рдгреА рд╕рдВрд░рдЪрдирд╛ рдмрд╣реБрдд рд╕реА рдЬрдЧрд╣ рд▓реЗрддреА рд╣реИред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, "рдРрд░реЗ" рд╢рдмреНрдж рдХреЛ рдпрд╣рд╛рдБ рдЪреБрдирд╛ рдЧрдпрд╛ рд╣реИред PHP рдореЗрдВ, рдПрдХ рд╕рд░рдгреА рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рддрд╛рд▓рд┐рдХрд╛рдУрдВ / рд╢рдмреНрджрдХреЛрд╢реЛрдВ рдХрд╛ рд╣реИрд╢ рд╣реИред рддреЛ рд╣реИрд╢ рдЯреЗрдмрд▓ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВ? рдореВрд▓ рд░реВрдк рд╕реЗ, рдкреНрд░рддреНрдпреЗрдХ рдХреБрдВрдЬреА рдХреЗ рд▓рд┐рдП рдПрдХ рд╣реИрд╢ рдЙрддреНрдкрдиреНрди рд╣реЛрддрд╛ рд╣реИ, рдФрд░ рдЗрд╕ рд╣реИрд╢ рдХрд╛ рдЙрдкрдпреЛрдЧ "рд╡рд╛рд╕реНрддрд╡рд┐рдХ" рд╕реА рд╕рд░рдгреА рдореЗрдВ рдЬрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рд╣реИрд╢рд┐рдВрдЧ рд╕рдВрдШрд░реНрд╖ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рд╕рднреА рддрддреНрд╡ рдЬрд┐рдирдХреЗ рдкрд╛рд╕ рд╕рдорд╛рди рд╣реИрд╢ рдПрдХ рд▓рд┐рдВрдХреНрдб рд╕реВрдЪреА рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рд╣реИрдВред рдХрд┐рд╕реА рддрддреНрд╡ рддрдХ рдкрд╣реБрдВрдЪрдиреЗ рдкрд░, PHP рдкрд╣рд▓реЗ рд╣реИрд╢ рдХреА рдЧрдгрдирд╛ рдХрд░рддрд╛ рд╣реИ, рд╡рд╛рдВрдЫрд┐рдд рдмреНрд▓реЙрдХ (рдмрд╛рд▓реНрдЯреА) рдХреА рддрд▓рд╛рд╢ рдХрд░рддрд╛ рд╣реИ, рдФрд░ рддрддреНрд╡ рджреНрд╡рд╛рд░рд╛ рд╕рдЯреАрдХ рдорд┐рд▓рд╛рди рддрддреНрд╡ рдХреА рддрд▓рд╛рд╢ рдореЗрдВ рд╕реВрдЪреА рд╕реЗ рдЧреБрдЬрд░рддрд╛ рд╣реИред рдПрдХ рдмреНрд▓реЙрдХ рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ ( zend_hash.h # 54 ):

 typedef struct bucket { ulong h; //  (    ) uint nKeyLength; //   (  ) void *pData; //  void *pDataPtr; // ???   ??? struct bucket *pListNext; // PHP  .     struct bucket *pListLast; //    struct bucket *pNext; //     ()   struct bucket *pLast; //     ()   const char *arKey; //  (  ) } Bucket; 


рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдПрдХ рд╕рд╛рд░ рдбреЗрдЯрд╛ рд╕рд░рдгреА рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдбреЗрдЯрд╛ рдХрд╛ "рд▓реЛрдб" рд╕реНрдЯреЛрд░ рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИ рдЬреИрд╕реЗ рдХрд┐ PHP (PHP рд╕рд░рдгрд┐рдпреЛрдВ рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рдПрд░реЗ, рдПрдХ рд╣реА рд╕рдордп рдореЗрдВ рд╢рдмреНрджрдХреЛрд╢реЛрдВ, рд▓рд┐рдВрдХ рдХрд┐рдП рдЧрдП рдФрд░ рд╕реВрдЪреАрдмрджреНрдз рд╕реВрдЪрд┐рдпрд╛рдБ рд╣реИрдВ, рдЬреЛ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдмрд╣реБрдд рдЕрдзрд┐рдХ рдбреЗрдЯрд╛ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ)ред рдЕрд▓рдЧ-рдЕрд▓рдЧ рдШрдЯрдХреЛрдВ рдХрд╛ рдЖрдХрд╛рд░ рд╣реИ: рдкреНрд░рдХрд╛рд░ рдХреЗ рд▓рд┐рдП 8 рдмрд╛рдЗрдЯреНрд╕ рдЙрд▓реЙрдиреНрдЧ , рдпреВрдЗрдВрдЯ рдХреЗ рд▓рд┐рдП 4 рдмрд╛рдЗрдЯреНрд╕ , рдФрд░ рдкреЙрдЗрдВрдЯрд░реНрд╕ рдХреЗ рд▓рд┐рдП 7 рдмрд╛рдЗрдЯреНрд╕ред рдкрд░рд┐рдгрд╛рдо 68 рд╣реИред рд╕рдВрд░реЗрдЦрдг рдЬреЛрдбрд╝реЗрдВ рдФрд░ 72 рдмрд╛рдЗрдЯреНрд╕ рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВред

рдмреНрд▓реЙрдХреЛрдВ рдХреЗ рд▓рд┐рдП, рд╕рд╛рде рд╣реА рд╕рд╛рде рдЬрд╝рд╡рд▓ рдХреЗ рд▓рд┐рдП, 16 рдмрд╛рдЗрдЯ рд╣реЗрдбрд░ рдЬреЛрдбрд╝реЗ рдЬрд╛рдиреЗ рдЪрд╛рд╣рд┐рдП, рдЬреЛ рд╣рдореЗрдВ 88 рдмрд╛рдЗрдЯреНрд╕ рджреЗрддрд╛ рд╣реИред рд╣рдореЗрдВ "рд╡рд╛рд╕реНрддрд╡рд┐рдХ" рд╕реА рд╕рд░рдгреА (рдмрд╛рд▓реНрдЯреА ** arBuckets;) рдореЗрдВ рдЗрди рдмреНрд▓реЙрдХреЛрдВ рдХреЛ рдкреЙрдЗрдВрдЯрд░реНрд╕ рд╕реНрдЯреЛрд░ рдХрд░рдиреЗ рдХреА рднреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдореИрдВрдиреЗ рдЗрд╕рдХреЗ рдКрдкрд░ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рд╣реИ, рдЬреЛ рддрддреНрд╡ рдореЗрдВ рдПрдХ рдФрд░ 8 рдмрд╛рдЗрдЯреНрд╕ рдЬреЛрдбрд╝рддрд╛ рд╣реИред рддреЛ рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рдкреНрд░рддреНрдпреЗрдХ рдмреНрд▓реЙрдХ 96 рдмрд╛рдЗрдЯреНрд╕ рдореЗрдореЛрд░реА рдХрд╛ рдЙрдкрднреЛрдЧ рдХрд░рддрд╛ рд╣реИред

рдФрд░ рдЗрд╕рд▓рд┐рдП, рдЕрдЧрд░ рд╣рдореЗрдВ рдкреНрд░рддреНрдпреЗрдХ рдореВрд▓реНрдп рдХреЗ рд▓рд┐рдП рдПрдХ рдмреНрд▓реЙрдХ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рддреЛ рдпрд╣ рдмрд╛рд▓реНрдЯреА рдХреЗ рд▓рд┐рдП 96 рдмрд╛рдЗрдЯреНрд╕ рдФрд░ рдЬрд╝рд╡рд▓ рдХреЗ рд▓рд┐рдП 48 рдмрд╛рдЗрдЯреНрд╕ рд╣реЛрдВрдЧреЗ , рдЬреЛ рдХреБрд▓ 144 рдмрд╛рдЗрдЯреНрд╕ рд╣реИред 100,000 рддрддреНрд╡реЛрдВ рдХреЗ рд▓рд┐рдП, рдпрд╣ 14,400,000 рдмрд╛рдЗрдЯреНрд╕ рдпрд╛ 13.73 рдПрдордмреА рд╣реЛрдЧрд╛ред

рдкрд╣реЗрд▓реА рд╣рд▓ рд╣реЛ рдЧрдИ рд╣реИред

рд░реБрдХреЛ, рдЕрднреА рднреА 0.24 рдПрдордмреА рд╣реИ!



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

рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдпрд╣ 2 ^ 17 = 131 072 рд╣реИред рд▓реЗрдХрд┐рди рд╣рдореЗрдВ рдЗрди рдмреНрд▓реЙрдХреЛрдВ рдореЗрдВ рд╕реЗ рдХреЗрд╡рд▓ 100,000 рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╣рдо 31 072 рдмреНрд▓реЙрдХреЛрдВ рдХреЛ рдЕрдкреНрд░рдпреБрдХреНрдд рдЫреЛрдбрд╝ рджреЗрддреЗ рд╣реИрдВред рдЙрди, рдЗрди рдмреНрд▓реЙрдХреЛрдВ рдХреЗ рд▓рд┐рдП рдореЗрдореЛрд░реА рдЖрд╡рдВрдЯрд┐рдд рдирд╣реАрдВ рдХреА рдЬрд╛рдПрдЧреА (рдЗрд╕рд▓рд┐рдП, рд╣рдореЗрдВ рдкреВрд░реЗ 96 рдмрд╛рдЗрдЯреНрд╕ рдЦрд░реНрдЪ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ), рд▓реЗрдХрд┐рди рдкреЙрдЗрдВрдЯрд░ (рдЬреЛ рдмреНрд▓реЙрдХреЛрдВ рдХреЗ рдЖрдВрддрд░рд┐рдХ рд╕рд░рдгреА рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рд╣реИ) рдХреЗ рд▓рд┐рдП рдореЗрдореЛрд░реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдмреНрд▓реЙрдХ рдкрд░ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рдЗрд╕рд▓рд┐рдП, рд╣рдо рдЕрддрд┐рд░рд┐рдХреНрдд рд░реВрдк рд╕реЗ 8 рдмрд╛рдЗрдЯреНрд╕ (рдкреНрд░рддрд┐ рд╕реВрдЪрдХ) * 31,072 рддрддреНрд╡реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред рдпрд╣ 248 576 рдмрд╛рдЗрдЯреНрд╕ рдпрд╛ 0.23 рдПрдордмреА рд╣реИред рдЬреЛ рд▓рд╛рдкрддрд╛ рдореЗрдореЛрд░реА рд╕реЗ рдореЗрд▓ рдЦрд╛рддреА рд╣реИред (рдмреЗрд╢рдХ, рдХреБрдЫ рдФрд░ рдмрд╛рдЗрдЯреНрд╕ рдЧрд╛рдпрдм рд╣реИрдВ, рд▓реЗрдХрд┐рди рдореИрдВ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╕рдм рдХреБрдЫ рдХрд╡рд░ рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВред рдпреЗ рд╣реИрд╢ рдЯреЗрдмрд▓ рдХреА рд╕рдВрд░рдЪрдирд╛, рдЪрд░ рдЖрджрд┐ рдЬреИрд╕реА рдЪреАрдЬреЗрдВ рд╣реИрдВ)

рдкрд╣реЗрд▓реА рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╣рд▓ рд╣реИред

рдпрд╣ рд╣рдореЗрдВ рдХреНрдпрд╛ рдмрддрд╛рддрд╛ рд╣реИ?



PHP C. рдирд╣реАрдВ рд╣реИ рдФрд░ рдпрд╣ рдХреЗрд╡рд▓ рд╣рдореЗрдВ рдмрддрд╛рддрд╛ рд╣реИред рдЖрдк рд╕реБрдкрд░-рдЧрддрд┐рд╢реАрд▓ PHP рднрд╛рд╖рд╛ рдХреА рдЕрдкреЗрдХреНрд╖рд╛ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗред рд╕реАред рдореЗрдВ рдореЗрдореЛрд░реА рдХрд╛ рдХреБрд╢рд▓рддрд╛ рд╕реЗ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред рдЖрдк рдРрд╕рд╛ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗред

рд▓реЗрдХрд┐рди, рдпрджрд┐ рдЖрдк рд╕реНрдореГрддрд┐ рдХреЛ рдмрдЪрд╛рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рдмрдбрд╝реЗ рд╕реНрдерд┐рд░ рд╕рд░рдгрд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП SplFixedArray рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рдЖрдЗрдП рд╕рдВрд╢реЛрдзрд┐рдд рд╕реНрдХреНрд░рд┐рдкреНрдЯ рджреЗрдЦреЗрдВ:

 <?php $startMemory = memory_get_usage(); $array = new SplFixedArray(100000); for ($i = 0; $i < 100000; ++$i) { $array[$i] = $i; } echo memory_get_usage() - $startMemory, ' bytes'; 


рдпрд╣ рдореВрд▓ рд░реВрдк рд╕реЗ рдПрдХ рд╣реА рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЕрдЧрд░ рдЖрдк рдЗрд╕реЗ рдЪрд▓рд╛рддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рджреЗрдЦреЗрдВрдЧреЗ рдХрд┐ рдпрд╣ "рдХреЗрд╡рд▓" 5,600,640 рдмрд╛рдЗрдЯреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред рдЬреЛ рдкреНрд░рддрд┐ рддрддреНрд╡ 56 рдмрд╛рдЗрдЯреНрд╕ рд╣реИ, рдЬреЛ рдХрд┐ рдПрдХ рдирд┐рдпрдорд┐рдд рд╕рд░рдгреА рдХреЗ 144 рдмрд╛рдЗрдЯреНрд╕ рдкреНрд░рддрд┐ рддрддреНрд╡ рд╕реЗ рдмрд╣реБрдд рдХрдо рд╣реИред рдРрд╕рд╛ рдЗрд╕рд▓рд┐рдП рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рд╕рд░рдгреА рдХреЛ рдПрдХ рдмрдХреЗрдЯ рд╕рдВрд░рдЪрдирд╛ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ: рдЗрд╕рд▓рд┐рдП рдЗрд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рддрддреНрд╡ рдХреЗ рд▓рд┐рдП рдХреЗрд╡рд▓ рдПрдХ zval (48 рдмрд╛рдЗрдЯреНрд╕) рдФрд░ рдПрдХ рдкреЙрдЗрдВрдЯрд░ (8 рдмрд╛рдЗрдЯреНрд╕) рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рдЬреЛ рд╣рдореЗрдВ рдПрдХ рдирдореВрджрд╛рд░ 56 рдмрд╛рдЗрдЯреНрд╕ рджреЗрдЧрд╛ред

PS рдХреГрдкрдпрд╛ рд▓реИрди рдкрд░ рдЕрдиреБрд╡рд╛рдж рдХреЗ рд╕рдВрдмрдВрдз рдореЗрдВ рд╕рднреА рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдВ рд▓рд┐рдЦреЗрдВ, рдФрд░ рдореИрдВ рдЙрдиреНрд╣реЗрдВ рддреБрд░рдВрдд рдареАрдХ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реВрдВрдЧрд╛ред

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


All Articles