рдХреНрдпрд╛ рдЖрдк 64-рдмрд┐рдЯ рдкреНрд▓реЗрдЯрдлреЙрд░реНрдо рдкрд░ PHP рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ? рдЗрд╕рд▓рд┐рдП рдкреНрд░рджрд░реНрд╢рди рдореЗрдВ рд╣рд╛рд░ рдЧрдП!





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



рдзреНрдпрд╛рди рджреЗрдВ ! рдирд┐рдореНрди рдкрд╛рда рдореЗрдВ рд╕реНрд░реЛрдд рдХреЛрдб рдХреЗ рдЯреБрдХрдбрд╝реЗ рд╕реЗ рд╣рд┐рдВрд╕рдХ рджреГрд╢реНрдп рд╢рд╛рдорд┐рд▓ рд╣реИрдВ рдФрд░ рдпрд╣ рдЖрдкрдХреЗ рдорд╕реНрддрд┐рд╖реНрдХ рдХреЛ рдЕрдкреВрд░рдгреАрдп рдХреНрд╖рддрд┐ рдкрд╣реБрдВрдЪрд╛ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рдорд╛рдирд╡рддрд╛ рдХреЗ рд▓рд┐рдирдХреНрд╕ php рдореЗрдВ рд╡рд┐рд╢реНрд╡рд╛рд╕ рдХреЛ рдирд╖реНрдЯ рдХрд░ рд╕рдХрддрд╛ рд╣реИред



рдпрд╣ рд╕рдм рдПрдХ рд╢рд┐рдХрд╛рдпрдд рдХреЗ рд╕рд╛рде рд╢реБрд░реВ рд╣реБрдЖ, рдЬреЛ рдХрд┐ 64-рдмрд┐рдЯ рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░ рдХреЗ рддрд╣рдд, рдирд┐рдореНрди PHP рд╕реНрдХреНрд░рд┐рдкреНрдЯ рднрдпрд╛рд╡рд╣ рд░реВрдк рд╕реЗ рдзреАрдореА рд╣реИ:

<?php



$cnt=0;

while ($cnt++<5) {



echo '----- TEST #'.$cnt.'-----<br>';



echo 'start FOR & WHILE testing<br>';



$start = microtime(1);

for($i=0;$i<3000000;$i++) {}

$end = microtime(1);

$time = $end - $start;

echo $time.' for($i=0;$i<3000000;$i++) {}<br>';



$start = microtime(1);

$i=0; while($i++<3000001) {}

$end = microtime(1);

$time = $end - $start;

echo $time.' while($i++<3000001) {}<br>';



$start = microtime(1);

$i=0; while($i<3000000) {$i++;}

$end = microtime(1);

$time = $end - $start;

echo $time.' while($i<3000000) {$i++;}<br>';



$start = microtime(1);

$i = 0;

while ($i<3000000): $i++; endwhile;

$end = microtime(1);

$time = $end - $start;

echo $time.' while ($i<3000000): $i++; endwhile;<br>';



echo '<br><br>start a.=b & a=ab testing<br>';



$a = NULL;

$b = ' , 40';

$start = microtime(1);

for($i=0;$i<3000000;$i++) {$a = $a.$b;}

$end = microtime(1);



$time = $end - $start;

echo $time.' for($i=0;$i<3000000;$i++) {$a = $a.$b;}<br>';



$a = NULL;

$b = ' , 40';

$start = microtime(1);

for($i=0;$i<3000000;$i++) $a = $a.$b;

$end = microtime(1);

$time = $end - $start;

echo $time.' for($i=0;$i<3000000;$i++) $a = $a.$b;<br>';



$a = NULL;

$b = ' , 40';

$start = microtime(1);

for($i=0;$i<3000000;$i++) {$a .= $b;}

$end = microtime(1);

$time = $end - $start;

echo $time.' for($i=0;$i<3000000;$i++) {$a.=$b;}<br>';



$a = NULL;

$b = ' , 40';

$start = microtime(1);

for($i=0;$i<3000000;$i++) $a .= $b;

$end = microtime(1);

$time = $end - $start;

echo $time.' for($i=0;$i<3000000;$i++) $a .= $b;<br>';



$a = NULL;

$b = ' , 40';

$start = microtime(1);

$i=0; while($i++<3000001) {$a.= $b;}

$end = microtime(1);

$time = $end - $start;

echo $time.' while($i++<3000001) {$a.= $b;}<br>';



$a = NULL;

$b = ' , 40';

$start = microtime(1);

$i=0; while($i++<3000001) $a.= $b;

$end = microtime(1);

$time = $end - $start;

echo $time.' $i=0; while($i++<3000001) $a.= $b;<br>';



}



?>









рджрд░рдЕрд╕рд▓, рдРрд╕реА рд╕рдорд╕реНрдпрд╛ php5.2 рдореЗрдВ рдореМрдЬреВрдж рд╣реИ, рдЬрд┐рд╕рдХрд╛ рд╡рд┐рднрд┐рдиреНрди рд╡рд┐рддрд░рдгреЛрдВ рдкрд░ рдкрд░реАрдХреНрд╖рдг рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдирддреАрдЬрддрди - рд╕рдорд╕реНрдпрд╛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдмрд┐рдЯ рдЧрд╣рд░рд╛рдИ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рдереАред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЕрдиреНрдп рджреБрднрд╛рд╖рд┐рдпреЛрдВ рдкрд░ рд╕рдорд╛рди рдХреЛрдб рдХреЗ рдПрдирд╛рд▓реЙрдЧ рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рдпрд╣ рдкрддрд╛ рдЪрд▓рд╛ рдХрд┐ - рд╡рд╣рд╛рдВ рдХреЛрдИ рд╕рдорд╛рди рд╕рдорд╕реНрдпрд╛ рдирд╣реАрдВ рд╣реИред

рддрджрдиреБрд╕рд╛рд░ - рдпрд╣ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рд╕реНрд╡рдпрдВ PHP рдХреА рд╕рдорд╕реНрдпрд╛ рдереА, рдЬреЛ 64 рдмрд┐рдЯреНрд╕ рдкрд░ рд╣реА рдкреНрд░рдХрдЯ рд╣реБрдИ рдереАред рд▓реЗрдХрд┐рди рдЗрддрдирд╛ рдХреНрдпреЛрдВ, рдПрдХ рд╣рдЬрд╛рд░ рд╢реИрддрд╛рди?



рдЗрд╕реЗ рд╕реНрдЯреНрд░реЗрд╕ рдХреЗ рд╕рд╛рде рд▓реЙрдиреНрдЪ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рдЬреЛ рдХрд┐ i386, PAE рдФрд░ x86_64 рдкрд░ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдорд╛рди рдЙрддреНрдкрдиреНрди рдХрд░рддрд╛ рд╣реИ:





рдпрд╣ brk рдХреНрдпрд╛ рд╣реИ, рдпрд╣ php рдХреА рдЧрддрд┐ рдХреЛ рдЗрддрдирд╛ рдкреНрд░рднрд╛рд╡рд┐рдд рдХреНрдпреЛрдВ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдРрд╕реА рд╕реНрдерд┐рддрд┐рдпреЛрдВ рд╕реЗ рдХреИрд╕реЗ рдмрдЪреЗрдВ?

рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдореИрдВ рдзреНрдпрд╛рди рджреЗрддрд╛ рд╣реВрдВ рдХрд┐ рд╡рд┐рд╖рдп рдХреЗ рд▓рд┐рдП рдЪрд┐рддреНрд░ рдХреНрд▓рд┐рдХ рдХрд░рдиреЗ рдпреЛрдЧреНрдп рд╣реИ рдФрд░ рдПрдХ рдореМрд▓рд┐рдХ рд▓реЗрдЦ рдХреА рдУрд░ рдЬрд╛рддрд╛ рд╣реИ рдЬреЛ рд╕реНрдореГрддрд┐ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд╕рднреА рд╡рд┐рд╡рд░рдгреЛрдВ рдХрд╛ рдЦреБрд▓рд╛рд╕рд╛ рдХрд░рддрд╛ рд╣реИред рд╣рд╛рд▓рд╛рдБрдХрд┐, рдпрд╣ рдмрд╣реБрдд рдЬрдЯрд┐рд▓ рдФрд░ рдЕрдВрдЧреНрд░реЗрдЬреА рдореЗрдВ рд╣реИред рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ, brk рдЖрдкрдХреЛ mmap рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдПрдХ рдЯреБрдХрдбрд╝реЗ рдХреЛ рдХрд╛рдЯрдиреЗ рдХреЗ рдмрдЬрд╛рдп рдЖрд╡рдВрдЯрд┐рдд рдореЗрдореЛрд░реА рдХреЗ рдЖрдХрд╛рд░ рдХреЛ рдмрджрд▓рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ, рдЬреЛ рдЗрд╕рдХреЗ рд╡рд┐рдЦрдВрдбрди рдХреЛ рдХрдо рдХрд░рддрд╛ рд╣реИред



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



рддреЛ рдХреНрдпреЛрдВ i386 рдкрд░ рд╣рдо рдХреЗрд╡рд▓ mmap рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рдЬрдмрдХрд┐ x86_64 brk рдкрд░ рд╡рд╣рд╛рдВ рдкреНрд░рд╡реЗрд╢ рдХрд░рддреЗ рд╣реИрдВ? рдЗрд╕ рдкреНрд░рд╢реНрди рдХрд╛ рдЙрддреНрддрд░ рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдореВрд▓ рд╕реНрд░реЛрдд рдХреА рдУрд░ рдореБрдбрд╝рддреЗ рд╣реИрдВ - рдореЙрд▓реЛрдХ :

Normally, malloc() allocates memory from the heap, and adjusts the size of the

heap as required, using sbrk(2). When allocating blocks of memory larger than

MMAP_THRESHOLD bytes, the glibc malloc() implementation allocates the memory

as a private anonymous mapping using mmap(2). MMAP_THRESHOLD is 128 kB by

default, but is adjustable using mallopt(3).









рдЕрдм рд╕рдм рдХреБрдЫ рдЬрдЧрд╣ рдореЗрдВ рдЧрд┐рд░ рдЧрдпрд╛ - x86_64 рдХреЗ рд▓рд┐рдП, MMAP_THRESHOLD рдмрдврд╝рд╛ рджрд┐рдпрд╛ рдЧрдпрд╛, рдЬрд┐рд╕рд╕реЗ рдЗрд╕ рддрд░рд╣ рдХрд╛ рдПрдХ рджрд┐рд▓рдЪрд╕реНрдк рдкрд░рд┐рдгрд╛рдо рд╕рд╛рдордиреЗ рдЖрдпрд╛, рдЬреЛ рдЬрд╛рд╣рд┐рд░ рддреМрд░ рдкрд░ PHP рдореЗрдВ рдПрдХ рдмрд╣реБрдд рд╣реА рдЪрд╛рд▓рд╛рдХ рдХрдЪрд░рд╛ рдХрд▓реЗрдХреНрдЯрд░ рдХреЗ рд╕рд╛рде рдЬреБрдбрд╝рд╛ рд╣реБрдЖ рдерд╛, рдЬрд┐рд╕рдиреЗ рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рдЦреБрдж рдХреЛ рдЖрдЙрдЯ рдХрд░ рджрд┐рдпрд╛ред



рдФрд░ i386 рдХреЗ рд░реВрдк рдореЗрдВ рдореЙрд▓реЙрдХ рдореЗрдВ рдХреЙрд▓ рд╡рд╛рдкрд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдкреБрд░рд╛рдиреЗ рдореВрд▓реНрдпреЛрдВ рдХреЛ рд╡рд╛рдкрд╕ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдЧреНрд▓рд┐рдмреИрдХ рдХреЛ рдЕрд╕реЗрдВрдмрд▓ рдХрд░рдХреЗ рдЗрд╕реЗ рд╡рд┐рд╢реНрд╡ рд╕реНрддрд░ рдкрд░ рдмрджрд▓рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЬреЛ рдХрд┐ рдХрд░реНрдиреЗрд▓ рдЪрд░реЛрдВ рдореЗрдВ рдкреБрд░рд╛рдиреЗ рдореВрд▓реНрдп рдХреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдХреЗ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЗ рд▓рд┐рдП рдЪреБрдирд┐рдВрджрд╛ рд░реВрдк рд╕реЗ рдЕрд╡рд╛рдВрдЫрдиреАрдп рд╣реИ рдпрд╛ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ (рдЬрдм рддрдХ рдХрд┐ рдЗрд╕ рд╡рд┐рдХрд▓реНрдк рдХреЗ рд╕рдорд░реНрдерди рд╕реЗ рдЧреНрд▓рд┐рдмрдХ рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ):

MALLOC_MMAP_THRESHOLD_ = 131072 рдирд┐рд░реНрдпрд╛рдд рдХрд░реЗрдВ



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



рдкреБрдирд╢реНрдЪ рдкрд░реАрдХреНрд╖рдг рдХрдВрд╕реЛрд▓ рд╕реЗ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рдЪрд▓рд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

strace php -f qq.php рдПрдХ рдЪрд┐рддреНрд░ рджреЗрдЧрд╛

MALLOC_MMAP_THRESHOLD_ = 131072 рд╕реНрдЯреИрдк php -f qq.php 64 рдмрд┐рдЯреНрд╕ рд╣реЛрдиреЗ рдкрд░, рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЕрд▓рдЧ рдПрдХ рджреЗрдЧрд╛ред



All Articles