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
)

パフォーマンス

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 が手抜きの実装で、頑張れば相当高速化できるはず。使う人がいたら頑張るので連絡下さい。