2008年9月7日日曜日

is_readable について

is_readable だと include_path を見てくれないようなので、以下の2つをつくって
どちらが早いか試してみた。isReadable は Zend_Loader での実装。



class readable {

public function test() {
$time1_s = microtime(true);
for($i = 0; $i < 2000; $i++ ){
self::isReadable('spyc/spyc.php5');
}
$time1_e = microtime(true);

$time2_s = microtime(true);
for($i = 0; $i < 2000; $i++ ){
self::isReadable2('spyc/spyc.php5');
}
$time2_e = microtime(true);

Zend_Debug::dump($time1_e - $time1_s);
Zend_Debug::dump($time2_e - $time2_s);
}

public static function isReadable($filename){
if (!$fh = @fopen($filename, 'r', true)) {
return false;
}
@fclose($fh);
return true;
}

public static function isReadable2($filename){
$ret = false;
$paths = explode(':',get_include_path());
foreach($paths as $path){
if(is_readable($path. '/' .$filename)){
$ret = true;
break;
}
}
return $ret;
}
}

※ get_include_path は . 以外に2つのディレクトリを返し、spyc/spyc.php5は最後のディレクトリに存在する。

1回目
float(1.2477900981903)

float(0.3044650554657)

2回目
float(1.3001132011414)

float(0.31661415100098)

3回目
float(1.3001132011414)

float(0.31661415100098)

と isReadable2 が圧勝。clearstatcache()を isReadable2 の中に追記しても+0.2秒程度。