2013年5月11日土曜日

Call-time pass-by-reference

PHP5.4からは関数呼び出し時の参照渡しができなくなりました。

サンプルコード 実行結果
Fatal error: Call-time pass-by-reference has been removed; If you would like to
pass argument by reference, modify the declaration of foo(). in C:\xampp\htdocs\
t.php on line 8

2013年5月6日月曜日

配列のメモリの話 その2

今回は制御構造とメモリ使用量の関係について調べてみます。

サンプルコード 実行結果
memory 1:160
memory 2:128
memory 3:0
個人的な予想に反してforよりforeachの方が省メモリであるという結果が出ました。
コードの書き方を何か間違えたかな…と思ったのですが原因についてはよく分かりませんでした。
listとeachを使ったループが最も省メモリであるのは予想通りです。
とても大きな配列をループさせる時はlistとeachで回すのも一つの方法かもしれませんね。

配列のメモリの話 その1

ArrayAccessと配列の比較を続ける前に
PHPの配列とメモリの関係について確認しておきましょう。

簡単なサンプルコードを書いてみます。

サンプルコード 実行結果
1
memory 1:56
memory 2:5324488
と、このようにtest1とtest2ではメモリの使用量に大きな差が出ています。

これは、関数に配列が引数として与えられた場合、
PHPはその時点ではスタック領域のポインタアドレスを渡していますが、
配列に変更があった時点でその配列のヒープ領域がコピーされ
別の変数として新しいスタック領域に別のポインタアドレスが保存されることを指します。

ArrayAccessと配列の比較 その1

ArrayAccessと配列の比較をしてみます。
まずは配列への値の格納からです。

今回はメモリの比較もしたかったのでいつものベンチマーク用の関数は使いません。

ArrayAccessのサンプルコード 実行結果
time:0.10538291931152
memory:8653392
配列のサンプルコード 実行結果
time:0.01983904838562
memory:8647760
と、速度もメモリ使用量も配列のほうがパフォーマンスが高いという結果になりました。

2013年5月5日日曜日

ArrayAccessの挙動

今回はArrayAccessインタフェースについての確認です。
ArrayAccessを実装したクラスは配列と同様の挙動をします。

サンプルコード 実行結果
string(21) "arr_object::offsetSet"
string(21) "arr_object::offsetSet"
string(21) "arr_object::offsetSet"
string(24) "arr_object::offsetExists"
bool(false)
string(21) "arr_object::offsetGet"
string(6) "array2"
string(23) "arr_object::offsetUnset"
arr_object Object
(
    [container:arr_object:private] => Array
        (
            [0] => array1
            [1] => array2
        )

)