コラム

PHPコードのベンチマーク

  • 2017.8.16

PHPを実装していて、あれ?これってどっちの方が早いんだろうと思うことはよくあることだと思います。
そんな時に軽くベンチマークが取れるようにクラスを実装しました。

interface BenchmarkInterface
{
    public static function start();
    public static function end();
}

class Benchmark implements BenchmarkInterface
{
    private static $start;
    private static $end;
    private static $Memory;
    private static $PeakMemory;

    public static function start()
    {
        list($usec, $sec) = explode(' ', microtime());
        self::$start = $usec + $sec;
    }

    public static function end()
    {
        list($usec, $sec) = explode(' ', microtime());
        self::$end = $usec + $sec;
        self::dumpMemory();
        self::view();
    }

    private static function dumpMemory()
    {
        self::$Memory = memory_get_usage();
        self::$PeakMemory = memory_get_peak_usage();
    }

    private static function view()
    {
        echo "\n<pre>";
        echo "Time: ".number_format(self::$end - self::$start, 8)." / ";
        echo "Memory: ".number_format(self::$Memory)." Byte / ";
        echo "Peak Memory: ".number_format(self::$PeakMemory)." Byte";
        echo "</pre>\n";
    }
}

staticなstartとendメソッドですので、テストの前後に記述する感じです。
処理時間と、endを呼び出した時点でのメモリ使用量、ピークメモリ使用量がわかります。

//ベンチマークスタート
Benchmark::start();

//テストクラス
class testClass
{
    public function __construct()
    {
        // ランダムな時間のスリープ
        usleep(mt_rand(100, 10000));

        echo "<p>Test.</p>\n";
    }
}

//10回インスタンスを作成
for ($i = 0; $i < 10; ++$i) { 
    $instance = new testClass();
}

//ベンチマークエンド
Benchmark::end(); //Time: 0.04600191 / Memory: 128,208 Byte / Peak Memory: 131,952 Byte

※ソースコード表示のプラグインに不具合があるみたいなので、17行目のfor文の不等号を全角にしています。

関連記事

コメント

  • トラックバックは利用できません。

  • コメント (0)

  1. この記事へのコメントはありません。