[ PHP ] パフォーマンス情報取得 ( メモリ使用量とディスクの空き容量 )

Pocket

ここでは、PHP でパフォーマンス情報を取得するサンプルコードを掲載しています。PHP ( Zend ) エンジンが確保したメモリ情報とディスクの空き容量を取得しています。

スポンサーリンク

メモリ使用量の取得

memory_get_usage 関数によって、スクリプト内のあるポイントで Zend エンジンが確保したメモリ使用量を取得することができます。メモリを使いすぎているポイントの調査やコードの記述方法をメモリ使用量の観点から最適化することに役立ちそうです。

以下は、for 文と foreach 文によるメモリの使用量の差異を取得するサンプルコードです。(なるべく、条件が等しくなるように記述しているつもりですが・・)

$nums = array(
              0 => 'zero',
              1 => 'one',
              2 => 'two',
              3 => 'three',
              4 => 'four',
              5 => 'five',
              6 => 'six',
              7 => 'seven',
              8 => 'eight',
              9 => 'nine',
             10 => 'ten',
       );

$loop_num   = 1;  // 繰り返し回数を設定(適宜値を調節する)
$system_mem = false; // システムが割り当てた実際のメモリの大きさを取得するか

$point1 = memory_get_usage($system_mem); // メモリ使用量計測

for($j=0; $j<$loop_num; $j++) {

    // for 文による繰り返し
    for($i=0; $i<count($nums)-1; $i++) {
        $buf[] = $nums[$i];
    }
}

$point2 = memory_get_usage($system_mem); // メモリ使用量計測

// 結果出力
var_dump($point2 - $point1);

$point3 = memory_get_usage($system_mem);

$i = 0;
for($j=0; $j<$loop_num; $j++) {
    
    // foreach 文による繰り返し
    foreach($nums as $value) {
        $buf2[] = $nums[$i++];
    }

    $i = 0;
}
$point4 = memory_get_usage($system_mem);

// 結果出力
var_dump($point4 - $point3);

動作結果

上記の for 文と foreach 文によるメモリ取得量の違いを下表に示します。

繰り返し回数 for メモリ使用量 foreach メモリ使用量 差分 ( for – foreach )
1 928 bytes 872 bytes 56 bytes
1000 545936 bytes 593840 bytes -47904 bytes

上記より、繰り返し回数が多ほど、foreach の方がメモリを食いそうだということは推測できると思います。ただし、上記の計測方法と計測結果については、メモリの確保量からコードの最適化を検討する一例として見て下さい。for 文と foreach 文の特性を結論付けているわけではありません。

ディスクサイズと空き容量を取得する

次に、ディスクサイズと空き容量を取得するサンプルスクリプトになります。ディスクの空き容量は disk_free_space 関数、ディスクサイズは disk_total_space 関数を使用して取得しています。

$freeSize = disk_free_space( "c:\\" );
echo "空き容量:" . $freeSize . "バイト\n";

$totalSize = disk_total_space( "c:\\" );
echo "ディスクサイズ:" . $totalSize . "バイト\n";

$use = ($totalSize - $freeSize) / $totalSize * 100;
echo "ディスク使用率:" . $use . "%\n";
参考

 

スポンサーリンク


Pocket

Leave a Comment

Your email address will not be published. Required fields are marked *