2008年3月11日火曜日

YAMLのキャッシュ@Zend_Cache

YAML というか Spyc は重いらしい、、、ということで、キャッシュして高速化を考えてみた。
せっかくなので、Zend_Config対応&Zend_Cacheを使ってみる。

参考:
cl.pocari.org:PHP 用 YAML パーサ spyc の結果をキャッシュする方法
http://cl.pocari.org/2006-03-17-2.html


キャッシュ関連を調べてるときに、簡単なYAML生成用スクリプトがあったので使わせてもらいました。
インデントをスペース二つにしたのと、$i <= 1000 にして。
(100000にしたらファイルが大きすぎるってSpycに怒られた^^; 1000でも1Mあるし問題なしということで。)

symfonyで開発日記:yaml形式のデータをfor文で大量生成
http://blog.symfony.jp/2007/09/25/making_yaml_by_phpcode/


とりあえず結果から。単位は秒。
Rf_Config_Yaml(wiki参照)利用の出力:float(8.76855)
Rf_Config_Yaml_Cache(wiki参照)利用の出力@キャッシュ前:float(9.34218)
Rf_Config_Yaml_Cache(wiki参照)利用の出力@キャッシュ後:float(0.099786)

か、簡単・・・

約100倍の高速化。Zend_Config にセットしてるので、実際はもう少し差が小さいかもしれない。
ただ、メガ単位のYAMLなんか使う気がないし、もっと小さいファイルだと誤差になりそうな気がする。。。

追記:
1k弱のファイルでやってみた。まあ、ちょっとだけ
キャッシュ非対応:float(0.019046)
キャッシュ前:float(0.038066)
キャッシュ後:float(0.016638)





Yamlロード用のZend_Config対応スクリプトは以下
http://www.reirou.jp/php/dokuwiki/doku.php?id=zend_framework:zend_config:yaml


アクション

class IndexController extends Zend_Controller_Action {
public function indexAction() {
$spyc_start = $this->getMicrotime();
$conf = new Rf_Config_Yaml('/path/to/config/sample.yml',null);
$spyc_end = $this->getMicrotime();
$spyc_f = (float)$spyc_end[0] - (float)$spyc_start[0];
$spyc_i = (float)$spyc_end[1] - (float)$spyc_start[1];
Zend_Debug::dump($spyc_i+$spyc_f);

$spyc_start = $this->getMicrotime();
$conf = new Rf_Config_Yaml_Cache('/path/to/config/sample.yml',null);
$spyc_end = $this->getMicrotime();
$spyc_f = (float)$spyc_end[0] - (float)$spyc_start[0];
$spyc_i = (float)$spyc_end[1] - (float)$spyc_start[1];
Zend_Debug::dump($spyc_i+$spyc_f);
}

private function getMicrotime(){
$mt = split(' ',microtime());
return $mt;
}
}