2010/03/03

[PHP, 最適化]「require_once() はコストがかかる。」


[追記]2013/01/25
今更以下の情報はさすがに古いです・・・
昔はこういうことがあったんだよと下の世代へお伝え下さい・・・。


よく言われる、「PHPの最適化 12 PHP Optimization tips」が本当か、今更ながら検証してみます。
環境は


  • EeePC 1002HA
  • Ubuntu 9.10
  • Apache/2.2.12 (Ubuntu)
  • PHP Version 5.2.10-2ubuntu6.4
 第3弾は「require_once() はコストがかかる。」
間違いなく使う requie_once() って遅い??


<?php
$limit = 10000;
$requiredFileName = 'a.php';

class TimeRecorder
{
    private $_holder = array();
    
    public function __construct(array $holderNames)
    {
        foreach ($holderNames as $name) {
            $this->_holeder[$name] = array();
        }
    }
    public function rec($holderName)
    {
        $this->_holeder[$holderName][] = microtime(true);
    }
    public function display()
    {
        $results = array();
        foreach ($this->_holeder as $holderName => $time) {
            $results[$holderName] = $time[1] - $time[0];
        }
        
        echo '<pre>';
        var_dump($results);
        echo '</pre>';
    }
}

$holder = new TimeRecorder(array(
    'require', 'require_once', 'include', 'include_once'
));
// require
$holder->rec('require');
for ($i = 0; $i < $limit; $i++) {
    require $requiredFileName;
}
$holder->rec('require');

// require_once
$holder->rec('require_once');
for ($i = 0; $i < $limit; $i++) {
    require_once $requiredFileName;
}
$holder->rec('require_once');

// include
$holder->rec('include');
for ($i = 0; $i < $limit; $i++) {
    include $requiredFileName;
}
$holder->rec('include');

// include_once
$holder->rec('include_once');
for ($i = 0; $i < $limit; $i++) {
    include_once $requiredFileName;
}
$holder->rec('include_once');

$holder->display();

結果

array(4) {
["require"]=>
float(3.83405184746)
["require_once"]=>
float(0.385987997055)
["include"]=>
float(11.2274429798)
["include_once"]=>
float(0.466109991074)
}

これも、そんなに気にするほどもない差だな・・・。
よく言われるのが、"条件付き読み込みは include を使う"みたいな。
require 系は読み込みに失敗すると、E_ERROR レベルの致命的なエラー
が発生するから、クラス読み込みとか、ファイルが読み込まれないと処理できない場面なんかで
使うとか。用途をちゃんと分けて使いたいもんです。