静的プロパティのパフォーマンスについて

2016年1月18日

PHP のクラスで、プロパティを呼び出す際に $this->data と self::$data で違いがあるのか知りたくなったので試してみた。

検証環境

$ php -v
PHP 5.3.3 (cli) (built: Oct 30 2014 20:12:53) 
Copyright (c) 1997-2010 The PHP Group
Zend Engine v2.3.0, Copyright (c) 1998-2010 Zend Technologies

検証コードと実行結果

$this->data

検証コード

<?php
class hoge
{
    public $data = 0;
    public function __construct()
    {   
        $startTime  = microtime(true);
        $baseMemory = memory_get_usage();
        for($i=0; $i<=10000000; $i++) {
            $this->data = $this->data + $i;
        } 
        echo "Memory," . (memory_get_usage() - $baseMemory).",Time," . (microtime(true) - $startTime)."\n";
    }
}
new hoge;

実行と結果

for i in {1..10}; do php hoge.php; done
Memory,144,Time,3.7434129714966
Memory,144,Time,3.5068159103394
Memory,144,Time,3.0471379756927
Memory,144,Time,3.9024441242218
Memory,144,Time,3.6528990268707
Memory,144,Time,3.2411978244781
Memory,144,Time,3.4192049503326
Memory,144,Time,3.6013069152832
Memory,144,Time,3.0494959354401
Memory,144,Time,3.1436560153961

self::$data

検証コード

<?php
class hoge
{
    public static $data = 0;
    public function __construct()
    {   
        $startTime  = microtime(true);
        $baseMemory = memory_get_usage();
        for($i=0; $i<=10000000; $i++) {
            self::$data = self::$data + $i;
        } 
        echo "Memory," . (memory_get_usage() - $baseMemory).",Time," . (microtime(true) - $startTime)."\n";
    }
}
new hoge;

実行と結果

for i in {1..10}; do php hoge.php; done
Memory,96,Time,3.6997120380402
Memory,96,Time,3.816370010376
Memory,96,Time,3.6376519203186
Memory,96,Time,3.7865500450134
Memory,96,Time,3.6384289264679
Memory,96,Time,3.763552904129
Memory,96,Time,3.7631800174713
Memory,96,Time,4.2476420402527
Memory,96,Time,4.5661520957947
Memory,96,Time,4.0321180820465

考察

もっと母数を増やしたり、オブジェクトを扱ったりしないと一概には言えない気がするが、静的にプロパティをコールして扱うとメモリの使用量は抑えられるが少し速度が落ちるということだろうか。