マジックメソッドの動作速度
検証:マジックメソッドの動作速度
Section titled “検証:マジックメソッドの動作速度”マジックメソッド(__get, __set)を使用したプロパティアクセスと、
マジックメソッドを使用しないプロパティアクセスの動作速度を検証しました
結果としては、マジックメソッドは遅いです
絶対値で見れば僅かな差ですが、相対的に見ると約15倍通常のプロパティアクセスの方が高速です
プロパティが1つの場合
Section titled “プロパティが1つの場合”テストコード
Section titled “テストコード”<?php
// CLIなら、ブラウザなら<br>define('NL', php_sapi_name() === 'cli' ? "\n" : "<br>");
// 計測結果の少数第何位まで表示するかdefine('ROUND_DIGIT', 10);
function benchmark($name, $test_fn, $step = 10) { $times = array(); $memories = array();
for($ii = 0; $ii < $step; $ii++) { $start = time() + microtime();
$test_fn(); $memories[] = memory_get_usage(true);
$end = time() + microtime();
$sub = $end - $start; $current = $ii + 1; echo sprintf("%d/%d => %.".ROUND_DIGIT."f%s", $current, $step, $sub, NL);
$times[] = $sub; }
$total_time_ms = array_sum($times) * 1000; $total_memory = array_sum($memories);
echo "=============================================".NL; echo sprintf("Result for '%s'%s", $name, NL); echo sprintf("Time:total: %.".ROUND_DIGIT."f ms%s", $total_time_ms, NL); echo sprintf("Time:average: %.".ROUND_DIGIT."f ms%s", $total_time_ms / $step, NL); echo sprintf("Memory:average: %d B (%.4f MB)%s", $total_memory / $step, ($total_memory / $step) / 1024, NL); echo sprintf("Memory:max: %d B (%.4f MB)%s", memory_get_peak_usage(true), memory_get_peak_usage(true) / 1024, NL); echo "=============================================".NL.NL;}
define('TEST', 1000);
set_time_limit(600);
// マジックメソッドを使用しないクラスclass Model { public $id = 1;}// マジックメソッドを使用するクラスclass MagicModel { public $attributes = array( 'id' => 1, );
public function __set($name, $value) { $this->attributes[$name] = $value; }
public function __get($name) { return $this->attributes[$name]; }}
benchmark('マジックメソッドを使用しないプロパティアクセス', function() { $model = new Model(); for($ii = 0; $ii < 10000; $ii++) { $tmp = $model->id; // 取得 $model->id = $ii; // 設定 }});
benchmark('マジックメソッドを使用したプロパティアクセス', function() { $model = new MagicModel(); for($ii = 0; $ii < 10000; $ii++) { $tmp = $model->id; // 取得 $model->id = $ii; // 設定 }});ベンチマーク結果
Section titled “ベンチマーク結果”1/10 => 0.00229287152/10 => 0.00221920013/10 => 0.00217390064/10 => 0.00218701365/10 => 0.00221109396/10 => 0.00249409687/10 => 0.00437903408/10 => 0.00333690649/10 => 0.003523826610/10 => 0.0023758411=============================================Result for 'プロパティ1つのクラスでマジックメソッドを使用しないプロパティアクセス'Time:total: 27.1937847137 msTime:average: 2.7193784714 msMemory:average: 262144 B (256.0000 MB)Memory:max: 262144 B (256.0000 MB)=============================================
1/10 => 0.04222893712/10 => 0.04851388933/10 => 0.03722095494/10 => 0.04586791995/10 => 0.04562091836/10 => 0.04514288907/10 => 0.04216909418/10 => 0.03836393369/10 => 0.044675111810/10 => 0.0502278805=============================================Result for 'プロパティ1つのクラスでマジックメソッドを使用したプロパティアクセス'Time:total: 440.0315284729 msTime:average: 44.0031528473 msMemory:average: 262144 B (256.0000 MB)Memory:max: 262144 B (256.0000 MB)=============================================プロパティを増やした場合
Section titled “プロパティを増やした場合”マジックメソッドはプロパティを走査するため、
プロパティを走査するのであれば、プロパティが増えれば取得にかかる時間も増えるという仮説のためにクラスとベンチマークスクリプトを少し書き換えます
ネクストエンジンAPIの商品マスタから取得できる項目を、
すべてクラスのプロパティとして定義し、その動作速度を検証します
これは、商品マスタの情報をDBに蓄積して利用するモデルがある想定です
テストコード
Section titled “テストコード”class Model { public $goods_id = 1; // 商品コード public $goods_representation_id = 1; // 代表商品コード public $goods_name = 1; // 商品名
// 長いので省略}class MagicModel { public $attributes = array( 'goods_id' => 1, // 商品コード 'goods_representation_id' => 1, // 代表商品コード 'goods_name' => 1, // 商品名
// 長いので省略 );}結果を先に説明すると、相対的に遅くなっています
ベンチマーク結果
Section titled “ベンチマーク結果”1/10 => 0.00398707392/10 => 0.00422596933/10 => 0.00390982634/10 => 0.00549197205/10 => 0.00527310376/10 => 0.00385808947/10 => 0.00547719008/10 => 0.00682091719/10 => 0.006251096710/10 => 0.0057909489=============================================Result for 'プロパティ110個のクラスでマジックメソッドを使用しないプロパティアクセス'Time:total: 51.0861873627 msTime:average: 5.1086187363 msMemory:average: 524288 B (512.0000 MB)Memory:max: 524288 B (512.0000 MB)=============================================
1/10 => 0.08229899412/10 => 0.08447718623/10 => 0.07753896714/10 => 0.07465600975/10 => 0.07611107836/10 => 0.08041906367/10 => 0.07519412048/10 => 0.08457803739/10 => 0.073424100910/10 => 0.0821299553=============================================Result for 'プロパティ110個のクラスでマジックメソッドを使用したプロパティアクセス'Time:total: 790.8275127411 msTime:average: 79.0827512741 msMemory:average: 524288 B (512.0000 MB)Memory:max: 524288 B (512.0000 MB)=============================================- 2015/02/17: 検証:マジックメソッドの動作速度ページ作成