Array_Typed 1.0.0 をリリースしました
PHP の Array はメモリを食い過ぎるので、なるべく最小限のメモリしか使わない配列風のクラスを作りました。
例えば、array の代わりに Array_Uint8 を使うとメモリ使用量が 100分の1以下。処理時間がおよそ倍(遅い)、位のパフォーマンスになります。
自作クラスなので
- array 関連のメソッドをそのまま使えない
- 配列の要素を参照渡し出来ない
- is_array で引っかからない。
といった罠があります。この辺りは SplFixedArray と似たようなものです。
インストール方法
$ git clone git@github.com:yoya/Array_Typed.git
- composer で IO_Bit をインストールします
$ cd Array_Typed
$ composer install
使い方
<?php require 'Array/Uint8.php'; $a = new Array_Uint8(10); $a[9] = 9; print_r($a->toArray());
- 結果
Array ( [0] => 0 [1] => 0 [2] => 0 [3] => 0 [4] => 0 [5] => 0 [6] => 0 [7] => 0 [8] => 0 [9] => 9 )
パフォーマンス
- test/perf_test.php の結果 (MacBook Pro 2014 mid モデル、PHP 5.5.27 で実行)
Array_Typed(master) $ php test/perf_test.php # array() // 1048576 memory:150995400 time:0.45449113845825 # SplFixedArray(1048576) memory:58720472 time:0.33372712135315 # Array_Uint8(1048576) memory:1048936 time:0.90760016441345 # Array_Sint16(1048576) memory:2097544 time:1.5867960453033
通常の array に比べて以下のような結果です。
- Array_Uint8 だとメモリ使用量が 1/143 位まで減る。処理時間は約2倍。
- Array_Sint16 はメモリ使用量が 1/71 位まで減る。処理時間は約3.5倍。
その他
- slice が手抜きの実装で、頑張れば相当高速化できるはず。使う人がいたら頑張るので連絡下さい。