[PHP-users 16702]Re: 【初歩的】どの書き方が一般的?改行削除はどうやるの?【質問】

Youichi Iwakiri yiwakiri @ st.rim.or.jp
2003年 7月 15日 (火) 14:39:42 JST


いわきりです

komura wrote in <20030715102116.289746c1.komura @ ma9.seikyou.ne.jp> :
>どこかで見かけたような気がしたのですが、見つけられませんでしたので、
>PEAR の Benchmark_Timer を使って確認してみました。

>$ cat test.php
><?php
>$str = 'test';
>for ( $i=0; $i<100000; ++$i ) {
>    $str . "<br>" ;
>}
>for ( $i=0; $i<100000; ++$i ) {
>    "$str<br>" ;
>}
>?>

この部分だけ内部コードで表すと
<?php
$str = 'test';
/*
    ZEND_FETCH_W        $str
    ZEND_ASSIGN         "test"
*/

for ( $i=0; $i<1; ++$i ) {
    $str . "<br>" ;
}
/*
    ZEND_FETCH_W        $i
    ZEND_ASSIGN         0
L1: ZEND_FETCH_R        $i
    ZEND_IS_SMALLER     100000
    ZEND_JMPZNZ         L2, L4
L2: ZEND_FETCH_R        $str
    ZEND_CONCAT         "<BR>"
    ZEND_FREE
    ZEND JMP            L3
L3: ZEND_FETCH_RW       $i
    ZEND_PREINC
    ZEND_JMP            L1
/*

for ( $i=0; $i<1; ++$i ) {
    "$str<br>" ;
}
/*
L4: ZEND_FETCH_W        $i
    ZEND_ASSIGN         0
L5: ZEND_FETCH_R        $i
    ZEND_IS_SMALLER     100000
    ZEND_JMPZNZ         L6, L8
L6: ZEND_INIT_STRING
    ZEND_FETCH_R        $str
    ZEND_ADD_VAR
    ZEND_ADD_STRING     "<"
    ZEND_ADD_STRING     "br"
    ZEND_ADD_STRING     ">"
    ZEND_FREE
    ZEND JMP            L7
L7: ZEND_FETCH_RW       $i
    ZEND_PREINC
    ZEND_JMP            L5
/*
/*
L8: ZEND_RETURN
/*
?>

ラベルL2, L6がループ内処理ですが、L6では、""で囲まれた
ものをtokenに切り出し個々を再結合する処理を取っているので
手数が掛かっています。

APC,MMCache等のオプティマイザを使うと
連続する定数文字結合などを1オペレーションに纏めてくれます

L6: ZEND_INIT_STRING
    ZEND_FETCH_R        $str
    ZEND_ADD_VAR
    ZEND_ADD_STRING     "<br>"
    ZEND_FREE
    ZEND JMP            L7
こんな風に

あとは、条件ジャンプの最適化も行われます。
ZEND_JMPZNZが最たるもので、条件が真の場合次のオペレーションに
必ず行くんですが、JMPNZに置き換えられます

#最近はAPCとかMMCacheの動作を検証してたりするんで参考までに

-- 
Youichi Iwakiri



PHP-users メーリングリストの案内