[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 メーリングリストの案内