锟斤拷锟杰凤拷锟芥考锟角碉拷锟斤拷锟斤拷

锟斤拷锟斤拷一锟斤拷锟斤拷锟斤拷锟窖撅拷锟津单碉拷锟结到锟斤拷锟斤拷锟秸匡拷锟杰革拷锟斤拷细微锟斤拷锟斤拷锟斤拷锟斤拷影锟届,锟斤拷锟斤拷锟角帮拷PHP 5.2锟斤拷PHP 5.3锟饺斤拷时锟斤拷锟叫的★拷锟斤拷锟斤拷锟斤拷PHP 5.2锟叫o拷锟斤拷录锟斤拷锟杰革拷锟斤拷锟斤拷锟斤拷锟饺拷锟斤拷锟铰硷拷锟斤拷芨锟揭拷锟叫╋拷锟斤拷锟絇HP 5.3锟叫讹拷 PHP run-time 锟斤拷锟斤拷锟斤拷锟睫改硷拷锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷锟绞э拷锟�

锟斤拷锟斤拷锟斤拷要锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷锟接帮拷臁o拷锟揭伙拷锟斤拷锟斤拷诖锟秸硷拷每占锟侥斤拷省锟斤拷锟斤拷一锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷锟秸伙拷锟斤拷执锟斤拷锟节达拷锟斤拷锟斤拷时锟斤拷执锟斤拷时锟斤拷锟斤拷锟斤拷(run-time delay)锟斤拷锟斤拷锟角斤拷锟叫撅拷锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷

锟节达拷占锟矫空硷拷慕锟绞�

锟斤拷锟饺o拷实锟斤拷锟斤拷锟斤拷锟斤拷锟秸伙拷锟狡碉拷锟斤拷锟斤拷原锟斤拷锟斤拷为锟剿o拷一锟斤拷锟饺撅拷锟斤拷锟斤拷锟斤拷锟姐,通锟斤拷锟斤拷锟斤拷循锟斤拷锟斤拷锟矫的憋拷锟斤拷锟斤拷锟斤拷省锟节达拷占锟矫★拷锟斤拷PHP执锟斤拷锟叫o拷一锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷锟剿伙拷锟竭碉拷锟斤拷gc_collect_cycles() 锟斤拷锟斤拷时锟斤拷锟酵伙拷执锟斤拷锟斤拷锟斤拷锟斤拷锟秸★拷锟斤拷锟斤拷图锟叫o拷锟斤拷示锟斤拷锟斤拷锟斤拷疟锟斤拷直锟斤拷锟絇HP 5.2 锟斤拷 PHP 5.3锟斤拷锟斤拷锟铰碉拷锟节达拷占锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷懦锟斤拷私疟锟斤拷锟斤拷锟绞盤HP锟斤拷锟斤拷占锟矫的伙拷锟斤拷锟节存。

Example #1 Memory usage example

<?php
class Foo
{
    public 
$var '3.1415962654';
}

$baseMemory memory_get_usage();

for ( 
$i 0$i <= 100000$i++ )
{
    
$a = new Foo;
    
$a->self $a;
    if ( 
$i 500 === )
    {
        echo 
sprintf'%8d: '$i ), memory_get_usage() - $baseMemory"\n";
    }
}
?>
Comparison of memory usage between PHP 5.2 and PHP 5.3

锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷缘锟斤拷锟斤拷锟斤拷校锟斤拷锟斤拷谴锟斤拷锟斤拷锟揭伙拷锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷锟叫碉拷一锟斤拷锟斤拷锟皆憋拷锟斤拷锟斤拷为指锟截讹拷锟斤拷锟斤拷锟斤拷循锟斤拷锟斤拷锟斤拷一锟斤拷锟截革拷(iteration)锟叫o拷锟斤拷锟脚憋拷锟叫的憋拷锟斤拷锟斤拷锟斤拷锟铰革拷锟斤拷时锟斤拷锟酵会发锟斤拷锟斤拷锟斤拷锟皆碉拷锟节达拷泄漏锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷校锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷锟叫孤╋拷锟�(锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷)锟斤拷锟斤拷锟角斤拷锟斤拷锟斤拷锟揭碉拷一锟斤拷锟斤拷锟杰革拷锟斤拷锟斤拷锟角憋拷unset锟斤拷锟角革拷锟斤拷锟斤拷锟斤拷锟斤拷10,000锟斤拷锟截革拷锟斤拷(也锟酵诧拷锟斤拷锟杰癸拷10,000锟斤拷锟斤拷锟杰革拷)锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷时锟斤拷锟斤拷执锟斤拷锟斤拷锟斤拷锟斤拷锟秸伙拷锟狡o拷锟斤拷锟斤拷锟酵凤拷锟斤拷些锟斤拷锟斤拷锟侥匡拷锟杰革拷锟斤拷锟节存。锟斤拷锟絇HP 5.3锟侥撅拷锟斤拷锟斤拷诖锟秸硷拷锟酵硷拷泻锟斤拷锟斤拷拙锟斤拷芸锟斤拷锟斤拷锟矫匡拷锟街达拷锟斤拷锟�10,000锟斤拷锟截革拷锟斤拷执锟斤拷锟斤拷锟斤拷锟斤拷锟秸o拷锟斤拷锟酵凤拷锟斤拷氐锟斤拷馗锟绞癸拷玫锟斤拷锟斤拷帽锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷泄漏锟斤拷锟斤拷锟捷结构锟角筹拷锟津单o拷锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷锟秸伙拷锟狡憋拷锟斤拷锟斤拷锟斤拷太锟洁工锟斤拷锟斤拷锟斤拷锟斤拷锟酵硷拷锟斤拷校锟斤拷锟斤拷芸锟斤拷锟� PHP 5.3锟斤拷锟斤拷锟斤拷诖锟秸硷拷么锟斤拷锟斤拷9 Mb锟斤拷锟斤拷PHP 5.2锟斤拷锟节达拷占锟斤拷一直锟斤拷锟接★拷

执锟斤拷时锟斤拷锟斤拷锟斤拷(Run-Time Slowdowns)

锟斤拷锟斤拷锟斤拷锟斤拷影锟斤拷锟斤拷锟杰的第讹拷锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷锟酵凤拷锟斤拷泄漏锟斤拷锟节达拷姆训锟绞憋拷洹N拷丝锟斤拷锟斤拷锟斤拷锟斤拷时时锟斤拷锟劫o拷锟斤拷锟斤拷锟斤拷微锟侥憋拷锟斤拷锟斤拷锟斤拷慕疟锟斤拷锟斤拷懈锟斤拷锟斤拷锟斤拷锟斤拷锟截革拷锟斤拷锟斤拷删锟斤拷锟斤拷循锟斤拷锟叫碉拷锟节达拷占锟矫硷拷锟姐,锟节讹拷锟斤拷锟脚憋拷锟斤拷锟斤拷锟斤拷锟铰o拷

Example #2 GC锟斤拷锟斤拷影锟斤拷

<?php
class Foo
{
    public 
$var '3.1415962654';
}

for ( 
$i 0$i <= 1000000$i++ )
{
    
$a = new Foo;
    
$a->self $a;
}

echo 
memory_get_peak_usage(), "\n";
?>

锟斤拷锟角斤拷锟斤拷锟斤拷锟斤拷锟斤拷疟锟斤拷锟斤拷危锟揭伙拷锟酵拷锟斤拷锟斤拷锟�zend.enable_gc 锟斤拷锟斤拷锟斤拷锟斤拷锟秸伙拷锟斤拷时锟斤拷锟斤拷一锟斤拷锟斤拷锟斤拷锟截憋拷时锟斤拷

Example #3 执锟斤拷锟斤拷锟较脚憋拷

time php -dzend.enable_gc=0 -dmemory_limit=-1 -n example2.php
# and
time php -dzend.enable_gc=1 -dmemory_limit=-1 -n example2.php

锟斤拷锟揭的伙拷锟斤拷锟较o拷锟斤拷一锟斤拷锟斤拷锟斤拷锟斤拷锟街达拷锟绞憋拷锟斤拷锟轿�10.7锟诫,锟斤拷锟节讹拷锟斤拷锟斤拷锟斤拷姆锟�11.4锟诫。时锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷7%锟斤拷然锟斤拷锟斤拷执锟斤拷锟斤拷锟斤拷疟锟绞憋拷诖锟秸硷拷玫姆锟街碉拷锟斤拷锟斤拷锟�98%锟斤拷锟斤拷931Mb 锟斤拷锟斤拷 10Mb锟斤拷锟斤拷锟斤拷锟阶硷拷锟斤拷呛芸锟窖э拷锟斤拷锟斤拷卟锟斤拷锟斤拷艽锟斤拷锟斤拷锟绞涤︼拷贸锟斤拷锟斤拷锟斤拷锟捷o拷锟斤拷锟斤拷锟斤拷锟斤拷确锟斤拷示锟斤拷锟斤拷锟斤拷锟斤拷锟秸伙拷锟斤拷锟斤拷锟节达拷占锟矫凤拷锟斤拷暮么锟斤拷锟斤拷锟斤拷锟较拷锟斤拷牵锟斤拷锟斤拷锟斤拷锟脚憋拷锟斤拷锟皆o拷锟斤拷执锟斤拷锟叫筹拷锟街革拷锟斤拷锟窖拷锟斤拷锟斤拷帽锟斤拷锟绞憋拷锟斤拷诖锟斤拷省锟侥革拷锟斤拷锟斤拷锟斤拷锟铰o拷每锟斤拷时锟斤拷锟斤拷锟接的百分比讹拷锟斤拷7%锟斤拷

PHP锟节诧拷 GC 统锟斤拷锟斤拷息

锟斤拷PHP锟节诧拷锟斤拷锟斤拷锟斤拷锟斤拷示锟斤拷锟斤拷墓锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷栈锟斤拷锟斤拷锟斤拷锟斤拷锟叫碉拷锟斤拷息锟斤拷锟斤拷锟斤拷要锟斤拷示锟斤拷些锟斤拷息锟斤拷锟斤拷锟斤拷要锟斤拷锟斤拷锟铰憋拷锟斤拷PHP使benchmark锟斤拷data-collecting code锟斤拷锟矫★拷锟斤拷锟斤拷要锟节帮拷锟斤拷锟斤拷锟斤拷锟皆革拷锟斤拷锟�./configure前锟斤拷锟窖伙拷锟斤拷锟斤拷锟斤拷CFLAGS锟斤拷锟矫筹拷-DGC_BENCH=1锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷畲拷锟斤拷锟斤拷锟斤拷锟斤拷锟铰o拷

Example #4 锟斤拷锟铰憋拷锟斤拷PHP锟斤拷锟斤拷锟斤拷GC benchmarking

export CFLAGS=-DGC_BENCH=1
./config.nice
make clean
make

锟斤拷锟斤拷锟斤拷锟铰憋拷锟斤拷锟絇HP锟斤拷锟斤拷锟斤拷锟侥硷拷锟斤拷锟斤拷锟斤拷执锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷哟锟斤拷耄拷锟絇HP执锟叫斤拷锟斤拷锟斤拷锟姐将锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷锟较拷锟�

Example #5 GC 统锟斤拷锟斤拷锟斤拷

GC Statistics
-------------
Runs:               110
Collected:          2072204
Root buffer length: 0
Root buffer peak:   10000

      Possible            Remove from  Marked
        Root    Buffered     buffer     grey
      --------  --------  -----------  ------
ZVAL   7175487   1491291    1241690   3611871
ZOBJ  28506264   1527980     677581   1025731

锟斤拷要锟斤拷锟斤拷息统锟斤拷锟节碉拷一锟斤拷锟介。锟斤拷锟杰匡拷锟斤拷锟斤拷锟斤拷锟斤拷锟秸伙拷锟斤拷锟斤拷锟斤拷锟斤拷110锟轿o拷锟斤拷锟斤拷锟斤拷锟斤拷110锟斤拷锟斤拷锟斤拷锟叫o拷锟杰癸拷锟叫筹拷锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷诖锟斤拷锟戒被锟酵放★拷只要锟斤拷锟斤拷锟斤拷锟秸伙拷锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷一锟轿o拷锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷值(Root buffer peak)锟斤拷锟斤拷10000.

锟斤拷锟斤拷

通锟斤拷锟斤拷PHP锟叫碉拷锟斤拷锟斤拷锟斤拷锟秸伙拷锟狡o拷锟斤拷锟斤拷锟斤拷循锟斤拷锟斤拷锟斤拷锟姐法确实锟斤拷锟斤拷时锟斤拷锟斤拷时锟斤拷锟斤拷锟斤拷锟较碉拷锟斤拷锟接★拷锟斤拷锟斤拷锟斤拷平锟斤拷锟斤拷(锟斤拷小锟斤拷)锟脚憋拷锟斤拷应锟斤拷锟斤拷锟斤拷没锟斤拷锟斤拷锟斤拷影锟届。

然锟斤拷锟斤拷锟斤拷平锟斤拷锟脚憋拷锟斤拷锟斤拷循锟斤拷锟斤拷锟秸伙拷锟斤拷锟斤拷锟叫碉拷锟斤拷锟斤拷拢锟斤拷诖锟侥斤拷省锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷纸疟锟酵憋拷锟斤拷锟斤拷锟斤拷锟侥凤拷锟斤拷锟斤拷锟较★拷锟斤拷为锟杰癸拷使锟矫碉拷锟节达拷没锟斤到锟斤拷锟睫★拷

锟斤拷锟街好达拷锟节筹拷时锟斤拷锟斤拷锟叫脚憋拷锟斤拷锟斤拷锟斤拷锟斤拷锟皆o拷锟斤拷锟界长时锟斤拷牟锟斤拷锟斤拷准锟斤拷锟斤拷锟絛aemon锟脚憋拷锟斤拷锟洁。同时锟斤拷锟斤拷通锟斤拷锟斤拷Web锟脚憋拷锟斤拷锟斤拷时锟戒长锟斤拷» PHP-GTK应锟矫筹拷锟斤拷锟铰碉拷锟斤拷锟斤拷锟斤拷锟秸伙拷锟狡o拷应锟矫伙拷锟斤拷谋锟揭恢憋拷锟斤拷锟斤拷锟轿拷诖锟叫孤╋拷锟斤拷锟斤拷锟斤拷越锟斤拷锟侥匡拷锟斤拷锟斤拷