[追記]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
間違いなく使う 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 レベルの致命的なエラー
が発生するから、クラス読み込みとか、ファイルが読み込まれないと処理できない場面なんかで
使うとか。用途をちゃんと分けて使いたいもんです。