
ãéåžžã®ãPHPéçºè
ã¯å®éã«ã¡ã¢ãªç®¡çã«ã€ããŠå¿é
ããå¿
èŠã¯ãªããšåºãä¿¡ããããŠããŸããããã±ã¢ããšãç¥èãã¯ãŸã å°ãç°ãªãæŠå¿µã§ãã 倿°ãšé
åãæäœãããšãã®ã¡ã¢ãªç®¡çã®ããã€ãã®åŽé¢ãšãPHPå
éšæé©åã®è峿·±ããèœãšã穎ãã匷調ããŠã¿ãŸãã ã芧ã®ãšãããæé©åã¯åªããŠããŸãããæé©åã®æ£ç¢ºæ§ãããããªãå Žåã¯ããæçœã§ãªãã¬ãŒãããçºçããå¯èœæ§ããããéåžžã«ç·åŒµããŸãã
äžè¬çãªæ
å ±
å°ããªæè²ããã°ã©ã
PHPã®å€æ°ã¯ãããã°ã2ã€ã®éšåã§æ§æãããŠããŸããhash_tablesymbol_tableã«æ ŒçŽãããŠããã
name ããšãzvalã³ã³ãããŒã«æ ŒçŽãããŠããã
value ãã§ãã
ãã®ã¡ã«ããºã ã«ãããåãå€ãåç
§ããè€æ°ã®å€æ°ãäœæã§ããå Žåã«ãã£ãŠã¯ã¡ã¢ãªæ¶è²»ãæé©åã§ããŸãã å®éã«ã©ã®ããã«èŠãããã¯ãåŸã§èª¬æããŸãã
å€ããå°ãªããæ©èœçãªã¹ã¯ãªãããæ³åããã®ãé£ããæãäžè¬çãªã³ãŒãèŠçŽ ã¯ã次ã®ç¹ã§ãã
-倿°ïŒçªå·ãè¡ãªã©ïŒã®äœæãå²ãåœãŠãåé€
-é
åã®äœæãšãã®ãã©ããŒã¹ïŒforeach颿°ãäŸãšããŠäœ¿çšããŸãïŒã
-颿°/ã¡ãœããã®å€ã®è»¢éãšæ»ãã
以äžã®èª¬æã¯ãã¡ã¢ãªãæäœãããããã®åŽé¢ã«ã€ããŠã§ãã ããã¯éåžžã«èšå€§ã§ããããšã倿ããŸãããã巚倧ãªè€éãã¯ãªãããã¹ãŠãéåžžã«ã·ã³ãã«ã§ãæããã«äŸããããŸãã
ã¡ã¢ãªãæäœããæåã®äŸ
æå§ãã«ãã¡ã¢ãªæ¶è²»åæã®å®è¡æ¹æ³ã®åºæ¬çãªäŸã
ãããè¡ãã«ã¯ãããã€ãã®åçŽãªé¢æ°ïŒ
func.phpãã¡ã€ã«ïŒã
å¿
èŠã§ãã
<ïŒphp
function memoryUsage ïŒ $ usage ã $ base_memory_usage ïŒ {
printf ïŒ "Bytes diffïŒ ïŒ
d \ n" ã $ usage-$ base_memory_usage ïŒ ;
}
颿° someBigValue ïŒ ïŒ {
return str_repeat ïŒ 'SOME BIG STRING' ã 1024 ïŒ ;
}
ïŒ>
ãããŠãæååã®ã¡ã¢ãªæ¶è²»ãã¹ãã®ç°¡åãªæåã®äŸïŒ
<ïŒphp
include ïŒ 'func.php' ïŒ ;
echo "æååã¡ã¢ãªäœ¿çšéãã¹ãã\ n \ n" ;
$ base_memory_usage = memory_get_usage ïŒ ïŒ ;
$ base_memory_usage = memory_get_usage ïŒ ïŒ ;
echo "éå§\ n" ;
memoryUsage ïŒ memory_get_usage ïŒ ïŒ ã $ base_memory_usage ïŒ ;
$ a = someBigValue ïŒ ïŒ ;
echo "æååå€ãèšå®ãããŸãã\ n" ;
memoryUsage ïŒ memory_get_usage ïŒ ïŒ ã $ base_memory_usage ïŒ ;
èšå®è§£é€ ïŒ $ a ïŒ ;
echo "æååå€ãèšå®ãããŠããŸãã\ n" ;
memoryUsage ïŒ memory_get_usage ïŒ ïŒ ã $ base_memory_usage ïŒ ;
ïŒ>
泚ïŒ
ééããªããã³ãŒãã¯æäœæ§ã®èгç¹ããæé©åãããŠããŸãããããã®å Žåããã®ãã¥ãŒãå®è£
ãããŠããã¡ã¢ãªæ¶è²»ã®å¯èŠæ§ã¯éåžžã«éèŠã§ããã³ãŒãã®çµæã¯éåžžã«æçœã§ãã
æååã¡ã¢ãªäœ¿çšéãã¹ãã
éå§ãã
ãã€ãdiffïŒ0
èšå®ãããæååå€
ãã€ãã®å·®åïŒ15448
èšå®ãããŠããªãæååå€
ãã€ãdiffïŒ0
åãäŸã§ããã
unsetïŒ$ aïŒã®ä»£ããã«
$ a = null; ã䜿çšã
ãŸãã ïŒ
éå§ãã
ãã€ãdiffïŒ0
èšå®ãããæååå€
ãã€ãã®å·®åïŒ15448
nullã«èšå®ãããæååå€
ãã€ãã®å·®åïŒ76
ã芧ã®ãšããã倿°ã¯å®å
šã«ã¯ç Žå£ãããŠããŸããã ãã®äžã«ã¯ãããã«76ãã€ããå²ãåœãŠããããŸãŸã§ãã
booleanãintegerãfloatãªã©ã®å€æ°ã«ãŸã£ããåãéãå²ãåœãŠãããããšãèãããšãããªããŸãšãã§ãã ããã¯
ã倿°å€ã«å²ãåœãŠãããã¡ã¢ãªã®éã§ã¯ãªããå²ãåœãŠããã倿°ïŒå€ãšå€æ°åèªäœãå«ãzvalã³ã³ããïŒã«é¢ããæ
å ±ãä¿åããããã®ç·ã¡ã¢ãªæ¶è²»éã§ãã
ãããã£ãŠãå²ãåœãŠã䜿çšããŠã¡ã¢ãªãè§£æŸããå Žåãæ£ç¢ºã«
nullå€ãå²ãåœãŠãå¿
èŠã¯ãããŸããã åŒ
$ a = 10000; ã¡ã¢ãªæ¶è²»ã«ã€ããŠãåãçµæãåŸãããŸãã
PHPã®ããã¥ã¡ã³ãã§ã¯ã
nullã«ãã£ã¹ããããšå€æ°ãšãã®å€ãç Žå£ããããšæžãã
ãŠããŸãã ããã®ã¹ã¯ãªããã¯ããã§ã¯ãªããå®éã«
ã¯ãã°ïŒããã¥ã¡ã³ãïŒã§ããããšã瀺ããŠããŸãã
unsetïŒïŒãå¯èœãªå Žåã«ã
nullå²ãåœãŠã䜿çšããã®ã¯ãªãã§ããïŒ
å²ãåœãŠã¯ïŒKOã®ãããã§ïŒå²ãåœãŠã§ããã€ãŸãã倿°ã®å€ãå€åããŸãããããã£ãŠãæ°ããå€ãå¿
èŠãšããã¡ã¢ãªãå°ãªãå Žåãããã«è§£æŸãããŸãããèšç®ãªãœãŒã¹ãå¿
èŠã«ãªããŸãïŒæ¯èŒçå°ãªãã§ããïŒã
unsetïŒïŒã¯ã倿°åãšãã®å€ã«å²ãåœãŠãããã¡ã¢ãªãè§£æŸããŸãã
ãããšã¯å¥ã«ã
unsetïŒïŒãš
nullã®å²ãåœãŠã¯å€æ°åç
§ã§ã¯éåžžã«ç°ãªãåäœããããšããäºå®ã«èšåãã䟡å€ããã
ãŸã ã
UnsetïŒïŒã¯ãªã³ã¯ã®ã¿
ãç Žæ£ãã
nullãå²ãåœãŠããšå€æ°åãåç
§ããå€ã倿Žãããããããã¹ãŠã®å€æ°ã¯
nullå€ãåç
§ããŸãã
泚ïŒ
unsetïŒïŒã¯é¢æ°ã§ãããšãã誀解ããããŸãããããã¯æ£ãããããŸããã unsetïŒïŒã¯ãããã¥ã¡ã³ãã«æç€ºçã«èšèŒãããŠããèšèªæ§æäœïŒ ifãªã©ïŒã§ããããã倿°ã®å€ãä»ããã¢ã¯ã»ã¹ã«ã¯äœ¿çšã§ããŸããã$ unset_func_name = 'unset' ;
$ unset_func_name ïŒ $ some_var ïŒ ;
æ idleãªæèã«é¢ããè¿œå æ
å ±ïŒäžèšã®äŸã倿Žããå ŽåïŒïŒ
$ a = arrayïŒïŒ;164ãã€ããå²ãåœãŠãæªèšå®ïŒ$ aïŒã¯ãã¹ãŠãè¿ããŸãã
ã¯ã©ã¹A {}
$ a = new AïŒïŒ;
184ãã€ããå²ãåœãŠãæªèšå®ïŒ$ aïŒã¯ãã¹ãŠãè¿ããŸãã
$ a =æ°ããstdClassïŒïŒ;272ãã€ããå²ãåœãŠãŸãããæªèšå®ïŒ$ aïŒã®åŸã«88ãã€ããããªãŒã¯ãããŸãïŒã©ãã§ããªããªãŒã¯ããããæ£ç¢ºã«èŠã€ããããšãã§ããŸããã§ããïŒã
ãããŸã§ã®ãšãããæååãšæ°å€ã¯éåžžã«æç¢ºã«ä¿åããã³åŠçããããããäžèšã®äŸã¯ã¡ã¢ãªæ¶è²»ã®èгç¹ããéèŠã§ã¯ãããŸããã é
åã䜿çšãããšããã¹ãŠãããã«æªåããŸãïŒãªããžã§ã¯ãã«ãå€ãã®æ©èœããããŸãããããã«ã¯å¥ã®èšäºãå¿
èŠã§ãïŒã
é
å
PHPã®é
åã¯ååãªã¡ã¢ãªãã䜿ãæããããŸããéåžžãåŠçäžã«å€§éã®ããŒã¿ãæ ŒçŽããã®ã¯ãã®ããã§ãããã®ããããããã®æäœã«ã¯ååæ³šæããå¿
èŠããããŸãã ãã ããPHPã§ã®é
åã®æäœã«ã¯ãæé©åã®é
åãããããã¡ã¢ãªæ¶è²»ã«é¢é£ããåé¡ã®1ã€ã«èšåãã䟡å€ããããŸãã
é°æ¹¿ãªäŸ1
< ïŒ php
include ïŒ 'func.php' ïŒ ;
echo "ã¢ã¬ã€ã¡ã¢ãªã®äœ¿çšäŸã" ;
$ base_memory_usage = memory_get_usage ïŒ ïŒ ;
$ base_memory_usage = memory_get_usage ïŒ ïŒ ;
echo ãããŒã¹äœ¿çšéãã ã PHP_EOL ;
memoryUsage ïŒ memory_get_usage ïŒ ïŒ ã$ base_memory_usage ïŒ ;
$ a = array ïŒ someBigValue ïŒ ïŒ ãsomeBigValue ïŒ ïŒ ãsomeBigValue ïŒ ïŒ ãsomeBigValue ïŒ ïŒ ïŒ ;
echo 'é
åãèšå®ãããŠããŸãã' ã PHP_EOL ;
memoryUsage ïŒ memory_get_usage ïŒ ïŒ ã$ base_memory_usage ïŒ ;
foreach ïŒ $ a as $ k => $ v ïŒ {
$ a [ $ k ] = someBigValue ïŒ ïŒ ;
èšå®è§£é€ïŒ $ kã$ v ïŒ ;
echo ãFOREACHãµã€ã¯ã«ãã ã PHP_EOL ;
memoryUsage ïŒ memory_get_usage ïŒ ïŒ ã$ base_memory_usage ïŒ ;
}
ãFOREACHã®çŽåŸã®äœ¿çšæ³ãããšã³ãŒããŸãã ã PHP_EOL ;
memoryUsage ïŒ memory_get_usage ïŒ ïŒ ã$ base_memory_usage ïŒ ;
èšå®è§£é€ïŒ $ a ïŒ ;
echo 'é
åæªèšå®' ã PHP_EOL ;
memoryUsage ïŒ memory_get_usage ïŒ ïŒ ã$ base_memory_usage ïŒ ;
ïŒ >
äžèŠã$ aé
åã®ã¡ã¢ãªæ¶è²»éã¯å€ãããªãããã«èŠãããããããŸããïŒå€æ°$ kããã³$ vã®èšå®ãé€ãïŒãããã®å Žåé
åãæäœããå ŽåãPHPã«ã¯ç¹å¥ãªã¢ãããŒãããããŸãã
åºåãèŠãŠãã ããïŒ
ã¢ã¬ã€ã®ã¡ã¢ãªäœ¿çšéã®äŸãããŒã¹ã®äœ¿çšéã
ãã€ãdiffïŒ0
é
åãèšå®ãããŠããŸãã
ãã€ãã®å·®åïŒ61940
FOREACHãµã€ã¯ã«ã
ãã€ãã®å·®åïŒ77632
FOREACHãµã€ã¯ã«ã
ãã€ãã®å·®åïŒ93032
FOREACHãµã€ã¯ã«ã
ãã€ãã®å·®åïŒ108432
FOREACHãµã€ã¯ã«ã
ãã€ãã®å·®åïŒ123832
FOREACHã®çŽåŸã®äœ¿çšã
ãã€ãã®å·®åïŒ61940
é
åãèšå®ãããŠããŸããã
ãã€ãdiffïŒ0
ãã®å Žåãforeachã«ãŒãã®æåŸã®å埩ã§ãé
åã«ããã¡ã¢ãªæ¶è²»ã2åã«ãªããŸããããããã¯ã³ãŒãèªäœããã¯æããã§ã¯ãããŸããã ãããããµã€ã¯ã«ã®çŽåŸã«ãã¡ã¢ãªæ¶è²»éã¯ä»¥åã®å€ã«æ»ããŸããã å¥è·¡ãªã©ã
ããã¯ãã«ãŒãå
ã®é
åã®äœ¿çšãæé©åããããã§ãã ã«ãŒãã®å®è¡äžãå
ã®é
åã倿Žããããšãããšãé
åæ§é ã®æé»çãªã³ããŒïŒå€ã®ã³ããŒã§ã¯ãªãïŒãäœæããããµã€ã¯ã«ã®çµããã«äœ¿çšå¯èœã«ãªããå
ã®æ§é ãç Žæ£ãããŸãã ãããã£ãŠãäžèšã®äŸã§ã¯ãæ°ããå€ãå
ã®é
åã«å²ãåœãŠãå Žåããããã¯ããã«ã¯çœ®ãæããããŸããããåå¥ã®ã¡ã¢ãªãå²ãåœãŠãããã«ãŒãã®çµäºæã«è¿ãããŸãã
ãã®ç¬éã¯éåžžã«èŠéãããããããããšãã°ããŒã¿ããŒã¹ãããã§ããããå Žåãªã©ãå€§èŠæš¡ãªããŒã¿é
åã䜿çšããŠãããµã€ã¯ã«äžã«å€§éã®ã¡ã¢ãªãæ¶è²»ãããå¯èœæ§ããããŸãã
泚ïŒ
ã«ãŒãèªäœã®å
éšã§ã¯ã$ a [$ k]ã®å€ã倿ŽããåŸã$ vã®å€ãä¿åããªãã£ãå Žåãå
ã®é
åã«ãŸã ä¿åãããŠããå€ãååŸã§ããŸããã $ a [$ k]ãç¹°ãè¿ãåŒã³åºããšãæ°ããå€ãçæãããŸãããŠãŒã¶ãŒ zibada ããã®è¿œå ïŒèŠããã«ïŒïŒ
倿Žã®å Žåã®æ°ãããäžæé
åããžã®ã¡ã¢ãªã®å²ãåœãŠã¯ãé
åã®æ§é å
šäœã«å¯ŸããŠäžåºŠã«è¡ãããŸããã倿ŽãããåèŠçŽ ã«å¯ŸããŠåå¥ã«è¡ãããããšãèæ
®ããããšãéèŠã§ãã ãããã£ãŠã倿°ã®èŠçŽ ãæã€é
åïŒãã ããå¿
ããã倧ããå€ã§ããå¿
èŠã¯ãããŸããïŒãããå Žåããã®ãããªã³ããŒäžã®1åéãã®ã¡ã¢ãªæ¶è²»ã倧ãããªããŸãã
é°æ¹¿ãªäŸ2
ã³ãŒããå°ã倿ŽããŸãããã
echo 'é
åãèšå®ãããŠããŸãã' ã PHP_EOL ;
memoryUsage ïŒ memory_get_usage ïŒ ïŒ ã$ base_memory_usage ïŒ ;
$ b = ïŒ $ a ; //ããã远å ããŸã
foreach ïŒ $ a as $ k => $ v ïŒ {
$ a [ $ k ] = someBigValue ïŒ ïŒ ;
èšå®è§£é€ïŒ $ kã$ v ïŒ ;
echo ãFOREACHãµã€ã¯ã«ãã ã PHP_EOL ;
memoryUsage ïŒ memory_get_usage ïŒ ïŒ ã$ base_memory_usage ïŒ ;
}
èšå®è§£é€ïŒ $ b ïŒ ; //ãããŠãã
ãFOREACHã®çŽåŸã®äœ¿çšãããšã³ãŒããŸãã ã PHP_EOL ;
memoryUsage ïŒ memory_get_usage ïŒ ïŒ ã$ base_memory_usage ïŒ ;
ã«ãŒãã³ãŒãèªäœã¯å€æŽããŸããã§ããã倿Žããã®ã¯ããœãŒã¹é
åãžã®åç
§ã«ãŠã³ããå¢ããããšã ãã§ããããããã«ããã«ãŒãæäœãæ ¹æ¬çã«å€æŽãããŸããã
ãã€ãdiffïŒ0
é
åãèšå®ãããŠããŸãã
ãã€ãã®å·®åïŒ61940
FOREACHãµã€ã¯ã«ã
ãã€ãã®å·®åïŒ61988
FOREACHãµã€ã¯ã«ã
ãã€ãã®å·®åïŒ61988
FOREACHãµã€ã¯ã«ã
ãã€ãã®å·®åïŒ61988
FOREACHãµã€ã¯ã«ã
ãã€ãã®å·®åïŒ61988
FOREACHã®çŽåŸã®äœ¿çšã
ãã€ãã®å·®åïŒ61940
é
åãèšå®ãããŠããŸããã
ãã€ãdiffïŒ0
å°ããªå€æŽïŒïŒ61988-61940 =åç
§å€æ°$ bãæ ŒçŽããããã®48ãã€ãïŒãããã§ãªããã°ãã«ãŒãã«äœ¿çšãããé
åãããèªäœãžã®è€æ°ã®åç
§ãæã€å ŽåãäŸ1ã®æé©åã¯é©çšãããªãããšãããããŸãã å
ã®é
åãå²ãåœãŠã«äœ¿çšãããŸãã
ã«ãŒãã«$ bé
åã䜿çšããå ŽåããŸãã¯ã«ãŒãå
ã§åç
§ã«ããå€ã®è»¢éã䜿çšããå ŽåããŸã£ããåãçµæãåŸãããŸãã
echo 'é
åãèšå®ãããŠããŸãã' ã PHP_EOL ;
memoryUsage ïŒ memory_get_usage ïŒ ïŒ ã$ base_memory_usage ïŒ ;
foreach ïŒ $ a as $ k => ïŒ $ v ïŒ {
$ a [ $ k ] = someBigValue ïŒ ïŒ ; //ãŸãã¯$ v = someBigValueïŒïŒ;
èšå®è§£é€ïŒ $ kã$ v ïŒ ;
echo ãFOREACHãµã€ã¯ã«ãã ã PHP_EOL ;
memoryUsage ïŒ memory_get_usage ïŒ ïŒ ã$ base_memory_usage ïŒ ;
}
ãFOREACHã®çŽåŸã®äœ¿çšæ³ãããšã³ãŒããŸãã ã PHP_EOL ;
memoryUsage ïŒ memory_get_usage ïŒ ïŒ ã$ base_memory_usage ïŒ ;
çµæïŒ
ãã€ãdiffïŒ0
é
åãèšå®ãããŠããŸãã
ãã€ãã®å·®åïŒ61940
FOREACHãµã€ã¯ã«ã
ãã€ãã®å·®åïŒ61940
FOREACHãµã€ã¯ã«ã
ãã€ãã®å·®åïŒ61940
FOREACHãµã€ã¯ã«ã
ãã€ãã®å·®åïŒ61940
FOREACHãµã€ã¯ã«ã
ãã€ãã®å·®åïŒ61940
FOREACHã®çŽåŸã®äœ¿çšã
ãã€ãã®å·®åïŒ61940
é
åãèšå®ãããŠããŸããã
ãã€ãdiffïŒ0
ããã§ãåç
§ã«ãã$ vã®è»¢éã远å ãããšããœãŒã¹é
åã®åç
§ã«ãŠã³ãã¯å¢å ããŸãããããæé©åããç¡å¹ã«ãªãããšã«æ³šæããŠãã ããã
åç
§ã«ãã転éãŸãã¯ã³ããŒã«ãã転é
ã¡ãœãããŸãã¯é¢æ°ã«éåžžã«å€§ããªå€ã転éããïŒãŸãã¯ãããããè¿ãïŒå Žåã¯ããäœããã¹ãããã®å Žåãæ€èšããŠãã ããã æåã®æçœãªè§£æ±ºçã¯ãéåžžãåç
§ã«ãããã¹/ãªã¿ãŒã³ã®äœ¿çšãæ€èšããããšã§ãã
ãã ããPHPã®ããã¥ã¡ã³ãã«ã¯ã
ããã©ãŒãã³ã¹ãåäžãããããã«åç
§æž¡ãã䜿çšããªãã§ãã ããã PHPã®äžæ žã¯ãæé©åèªäœãè¡ãããšã§ãã
ãããã©ã®ãããªãæé©åãã§ããããçè§£ããŠã¿ãŸãããã
ãŸããæãåçŽãªäŸïŒãããŸã§ã®ãšããåŒæ°ãæž¡ããã«ïŒïŒ
...
$ a = someBigValue ïŒ ïŒ ;
$ b = $ a ;
echo "æååå€ãèšå®ãããŸãã" ;
memoryUsage ïŒ memory_get_usage ïŒ ïŒ ã$ base_memory_usage ïŒ ;
èšå®è§£é€ïŒ $ aã$ b ïŒ ;
...
ããã€ã¬ã¯ãããžãã¯ãã§ã¯ã倿°ã®å€çšã«2ã€ã®ãããã¯ãã¡ã¢ãªã«å²ãåœãŠãå¿
èŠããããŸãã ãã ããPHPã¯ãã®ç¹ãæé©åããŸãã
éå§ãã
ãã€ãdiffïŒ0
èšå®ãããæååå€
ãã€ãã®å·®åïŒ15496
èšå®ãããŠããªãæååå€
ãã€ãdiffïŒ0
ãã®å Žåã倿°$ aã¯15448ãã€ãã§å ããããæ®ãã®48ãã€ãã¯å€æ°$ bã«å²ãåœãŠãããŸããããããã®éã«ãªã³ã¯ã¯ãããŸããã ãã®ã¡ã¢ãªæ¶è²»ã¯ããããã®å€æ°ã®ãããããäœããã®åœ¢ã§å€æŽããããå®éã«ã¯å€æŽããªããŠãããã®å€ã§äœããå®è¡ãããŸã§ä¿æãããŸãã
$ a = someBigValue ïŒ ïŒ ;
$ b = $ a ;
$ b = strval ïŒ $ b ïŒ ;
echo "æååå€ãèšå®ãããŸãã" ;
memoryUsage ïŒ memory_get_usage ïŒ ïŒ ã$ base_memory_usage ïŒ ;
èšå®è§£é€ïŒ $ aã$ b ïŒ ;
ãã®çµæãçµè«ãåŸãããŸãã
ãã€ãdiffïŒ0
èšå®ãããæååå€
ãã€ãã®å·®åïŒ30896
èšå®ãããŠããªãæååå€
ãã€ãdiffïŒ0
ã芧ã®ãšããã倿°$ bã®å€ããã¿ãããããããšãããšãã¹ã¯ãªããããã®ã¹ãã¬ãŒãžã«å¥ã®ã¡ã¢ãªé åãå²ãåœãŠãããã«ãªããŸãã $ aã®å€ããã¿ãããããããšãããšãåãããšãèµ·ãããŸãã
ãã®æé©åã¯ãé
åã®åã
ã®å€ã§ãããç¹å®ã®å€ã«å¯ŸããŠæå¹ã§ãã
ãããããããçè§£ããã«ã¯ã以äžã®äŸãèŠãŠãã ããã
$ a = array ïŒ someBigValue ïŒ ïŒ ãsomeBigValue ïŒ ïŒ ïŒ ; // 31052ãã€ã
$ b = $ a ; // + 48ãã€ã= 31100ãã€ã
$ b [ 0 ] = someBigValue ïŒ ïŒ ;
echo "æååå€ãèšå®ãããŸãã" ;
memoryUsage ïŒ memory_get_usage ïŒ ïŒ ã$ base_memory_usage ïŒ ;
èšå®è§£é€ïŒ $ aã$ b ïŒ ;
ãã®äŸã§ã¯ä»¥äžãåŸãããŸãã
ãã€ãdiffïŒ0
èšå®ãããæååå€
ãã€ãã®å·®åïŒ46704
èšå®ãããŠããªãæååå€
ãã€ãdiffïŒ0
ã€ãŸããçµæãšããŠã$ bé
åå
šäœã§ã¯ãªããé
åã®ãŒãèŠçŽ ã®å€ã®ã³ããŒã®ã¿ãäœæããããã«ãæ°ããã¡ã¢ãªïŒ15k +ãã€ãïŒãå²ãåœãŠãããŸããã $ b [1]ã®å€ã¯ãäŸç¶ãšããŠ$ a [1]ãšãæé©ã«é¢é£ãããŠããŸãã
äžèšã®ãã¹ãŠã¯ã颿°ãšã¡ãœããã®å
å€ã§ãæé©åãããã³ããŒããéããŠå€ã転é/è¿ãããã«åæ§ã«æ©èœããŸãã ã¡ãœããå
ã§æž¡ãããå€ããã¿ãããããªãå Žåãå¥ã®ã¡ã¢ãªé åã¯å²ãåœãŠãããŸããïŒã¡ã¢ãªã¯å€æ°åã®äžã«ã®ã¿å²ãåœãŠãããå€ã«é¢é£ä»ããããŸãïŒã ãã³ããŒããæž¡ããŠã¡ãœããå
ã®å€ã倿Žããå Žåã倿Žãè¡ãåã«ãå€ã®å®éã®å®å
šãªã³ããŒãæ¢ã«äœæãããŸãã
ãã®ããã«ããŠãPHPã¯ãªã³ã¯ã®åãæž¡ãã䜿çšããŠã¡ã¢ãªäœ¿çšéãæé©åããå¿
èŠæ§ãå®éã«æé€ããŸãã åç
§æž¡ãã¯ãã¡ãœããã®å€éšãããããã®å€æŽã衚瀺ããããã«å
ã®å€ã倿Žããå¿
èŠãããå Žåã«ã®ã¿ãå®çšçã«éèŠã§ãã
äŸã®ã³ãŒãïŒ
< ïŒ php
include ïŒ 'func.php' ïŒ ;
颿°testUsageInside ïŒ $ big_valueã$ base_memory_usage ïŒ {
echo ã颿°å
ã§ã®äœ¿çšããã®åŸ$ big_valueã¯å€æŽãããŸãããã ã PHP_EOL ;
memoryUsage ïŒ memory_get_usage ïŒ ïŒ ã$ base_memory_usage ïŒ ;
$ big_value [ 0 ] = someBigValue ïŒ ïŒ ;
echo '颿°å
ã§ã®äœ¿çšããã®åŸ$ big_value [0]ã倿ŽãããŸããã ã PHP_EOL ;
memoryUsage ïŒ memory_get_usage ïŒ ïŒ ã$ base_memory_usage ïŒ ;
$ big_value [ 1 ] = someBigValue ïŒ ïŒ ;
echo ã颿°å
ã®äœ¿çšæ³ã¯ããã®åŸ$ big_value [1]ã倿ŽãããŸãããã ã PHP_EOL ;
memoryUsage ïŒ memory_get_usage ïŒ ïŒ ã$ base_memory_usage ïŒ ;
}
echo "ã¢ã¬ã€ã¡ã¢ãªã®äœ¿çšäŸã" ;
$ base_memory_usage = memory_get_usage ïŒ ïŒ ;
$ base_memory_usage = memory_get_usage ïŒ ïŒ ;
echo ãããŒã¹äœ¿çšéãã ã PHP_EOL ;
memoryUsage ïŒ memory_get_usage ïŒ ïŒ ã$ base_memory_usage ïŒ ;
$ a = array ïŒ someBigValue ïŒ ïŒ ãsomeBigValue ïŒ ïŒ ãsomeBigValue ïŒ ïŒ ãsomeBigValue ïŒ ïŒ ïŒ ;
echo 'é
åãèšå®ãããŠããŸãã' ã PHP_EOL ;
memoryUsage ïŒ memory_get_usage ïŒ ïŒ ã$ base_memory_usage ïŒ ;
testUsageInside ïŒ $ aã$ base_memory_usage ïŒ ;
echo '颿°åŒã³åºãçŽåŸã®äœ¿çšæ³' ã PHP_EOL ;
memoryUsage ïŒ memory_get_usage ïŒ ïŒ ã$ base_memory_usage ïŒ ;
èšå®è§£é€ïŒ $ a ïŒ ;
echo 'é
åæªèšå®' ã PHP_EOL ;
memoryUsage ïŒ memory_get_usage ïŒ ïŒ ã$ base_memory_usage ïŒ ;
ïŒ >
çµè«ïŒ
ã¢ã¬ã€ã¡ã¢ãªã®äœ¿çšäŸã
åºæ¬çãªäœ¿çšæ³ã
ãã€ãdiffïŒ0
é
åãèšå®ãããŠããŸãã
ãã€ãã®å·®åïŒ61940
颿°å
ã§ã®äœ¿çšã¯ã$ big_valueã¯å€æŽãããŸããã
ãã€ãã®å·®åïŒ61940
颿°å
ã§ã®äœ¿çšã¯ããã®åŸ$ big_value [0]ã倿ŽãããŸããã
ãã€ãã®å·®åïŒ77632
颿°å
ã§ã®äœ¿çšã倿Žããã$ big_value [1]ã倿ŽãããŸããã
ãã€ãã®å·®åïŒ93032
颿°åŒã³åºãçŽåŸã®äœ¿çšã
ãã€ãã®å·®åïŒ61940
é
åãèšå®ãããŠããŸããã
ãã€ãdiffïŒ0
äŸãããããããã«ãå€ãå®éã«ã³ããŒã«ãã£ãŠè»¢éãããŠãããšããäºå®ã«ããããããã颿°ã®é
åã®ã³ããŒã¯äœæãããŸããã§ããã ãŸãã転éãããé
åãéšåçã«å€æŽããŠããå®å
šãªã³ããŒã¯äœæããããæ°ããå€ã«ã®ã¿ã¡ã¢ãªãå²ãåœãŠãããŸããã
æ
å ±æäŸã®ã¿ãç®çãšããŠã次ã®2ã€ã®å€ã«æ³šæãã䟡å€ããããŸãã
é
åãèšå®ãããŠããŸãã
ãã€ãã®å·®åïŒ61940
颿°å
ã§ã®äœ¿çšã¯ã$ big_valueã¯å€æŽãããŸããã
ãã€ãã®å·®åïŒ61940
å®éã«æ°ãã倿°$ big_valueãåºçŸããŸããããå¶åŸ¡ã颿°ã«è»¢éããããšãã«ã¡ã¢ãªæ¶è²»ã¯å¢å ããŸããã§ããã ããã¯ãã¹ã¯ãªããããã¹ãã®è§£ææ®µéã§ããã€ã³ã¿ãŒããªã¿ãŒããã®é¢æ°ãã³ãŒãã§äœ¿çšãããã©ãããæ±ºå®ããå
¥åãã©ã¡ãŒã¿ãŒã®ååã«ã¡ã¢ãªå
ã®å Žæãäºåã«å²ãåœãŠããšããäºå®ã«ãããã®ã§ãïŒé¢æ°ã䜿çšãããªãå Žåãã€ã³ã¿ãŒããªã¿ãŒã¯ãããç¡èŠããã¡ã¢ãªãå²ãåœãŠãŸããïŒã ãŸãããã³ããŒã«ããæé©åããã転éããè¡ããããããæ¢åã®å€æ°å$ big_valueã¯åçŽã«æé»çã«å€§ããªé
å$ aã«ãæ¥ç¶ããããŸããã ãã®çµæã远å ã®1ãã€ããè²»ããããšãªããå€ã¯ãã³ããŒãä»ããŠã颿°ã«è»¢éãããŸããã
泚ïŒ
PHP5ã§ã¯ïŒPHP4ãšã¯ç°ãªãïŒãããã©ã«ãã§ãã¹ãŠã®ãªããžã§ã¯ããåç
§ã«ãã£ãŠæž¡ãããŸãããå®éã«ã¯ããã¯å£ã£ããªã³ã¯ã§ãã ãã¡ãã®èšäºãã芧ãã ãããç°¡åãªçµè«
ééããªããPHPã§ã®ã¡ã¢ãªäœ¿çšéã®æé©åã®äŸã¯ãããããã€ã³ã¶ãã±ãããã«ãããŸããããã¡ã¢ãªæ¶è²»ãæé©åããäžèŠãªé çããããªããæãããã«éžæããã³ãŒããèããããšãçã«ããªã£ãŠããæãäžè¬çãªã±ãŒã¹ã«ã€ããŠèª¬æããŸãã
ãããšã¯å¥ã«ããªããžã§ã¯ãã䜿çšãããšãã«ã¡ã¢ãªãæ¶è²»ããŠæé©åããã¡ã«ããºã ã«è§Šããããšã¯äŸ¡å€ããããŸãããå¯èœãªäŸãè±å¯ã§ããããããã®ç¹ã«ã¯å¥ã®èšäºãå¿
èŠã§ãã ãã¶ããã€ãã
PSïŒãããããã€ãã®èšäºã«åè§£ããããšã¯å¯èœã§ããããã®ãããªæ
å ±ããäžç·ã«ãä¿åããæ¹ãããã®ã§ããã€ã³ãã¯ããããŸããã ãã®æ
å ±ãå®çšçãªæå³ãæã€äººã¯ãã䟿å©ã«ãªããšæããŸãã PHP 5.3.2ïŒUbuntu 32bitïŒã§ãã¹ããããŠãããããå²ãåœãŠããããã€ãã®å€ã¯ç°ãªãå ŽåããããŸãã
ããå€ãã®äŸ¿å©ãªãã®ããè±èªã§ïŒ
nikic.github.com/2011/12/12/How-big-are-PHP-arrays-really-Hint-BIG.htmlnikic.github.com/2011/11/11/PHP-Internals-When-does-foreach-copy.htmlblog.golemon.com/2007/01/youre-being-lied-to.htmlhengrui-li.blogspot.com/2011/08/php-copy-on-write-how-php-manages.htmlsldn.softlayer.com/blog/dmcaloon/PHP-Memory-Management-Foreachblog.preinheimer.com/index.php?/archives/354-Memory-usage-in-PHP.htmlderickrethans.nl/talks/phparch-php-variables-article.pdfUPDèšäºã®äž»èŠéšåã¯éèŠãªãã€ã³ããã«ããŒããŠããŸããã§ããã
ãªã³ã¯ãäœæããã倿°ãããå Žåããã®å€æ°ãåŒæ°ãšããŠé¢æ°ã«æž¡ããããšãããã«ã³ããŒãããŸããã€ãŸããã³ããŒãªã³ã©ã€ãæé©åã¯é©çšãããŸããã
äŸïŒ
< ïŒ php
include ïŒ 'func.php' ïŒ ;
颿°testFunc ïŒ $ aã$ base_memory_usage ïŒ {
memoryUsage ïŒ memory_get_usage ïŒ ïŒ ã$ base_memory_usage ïŒ ;
}
$ base_memory_usage = 0 ;
$ base_memory_usage = memory_get_usage ïŒ ïŒ ;
memoryUsage ïŒ memory_get_usage ïŒ ïŒ ã$ base_memory_usage ïŒ ; // 0ãã€ã
$ a = someBigValue ïŒ ïŒ ;
$ b = ïŒ $ a ;
memoryUsage ïŒ memory_get_usage ïŒ ïŒ ã$ base_memory_usage ïŒ ; // 15496ãã€ã
testFunc ïŒ $ aã$ base_memory_usage ïŒ ; // 30896ãã€ã
memoryUsage ïŒ memory_get_usage ïŒ ïŒ ã$ base_memory_usage ïŒ ; // 15496ãã€ã
èšå®è§£é€ïŒ $ aã$ b ïŒ ;
memoryUsage ïŒ memory_get_usage ïŒ ïŒ ã$ base_memory_usage ïŒ ; // 0ãã€ã
ïŒ >