oci_pconnectの第4引数を指定するとパフォーマンス向上
Oracle9.2以降を使っている場合、oci_pconnectの第4引数にキャラクタセットを指定できます(9.2以前の場合、環境変数NLS_LANGが使われる)が、このパラメータを指定すると、パフォーマンスが向上するとのこと。
で、実際に試してみました。環境は
I used AL32UTF8 which is the character set of the Oracle XE "Universal" database I have.Testing with the database and PHP both on my little old machine I was getting figures like 0.6 vs 2.7 seconds for 50,000 pconnect calls in the one script. I saw some other results that showed only a three-times difference.
な感じで、すべて同一サーバ上です。テストコードは、
<?php echo phpversion(); ?> <hr> <?php function microtime_float() { list($usec, $sec) = explode(" ", microtime()); return ((float)$usec + (float)$sec); } define('LOOP_COUNT', 10000); $start_time = microtime_float(); for ($i = 0; $i < LOOP_COUNT; $i++) { oci_pconnect('scott', 'tiger', 'reco'); } $end_time = microtime_float(); echo ($end_time - $start_time) . 'sec<br>'; $start_time = microtime_float(); for ($i = 0; $i < LOOP_COUNT; $i++) { oci_pconnect('scott', 'tiger', 'reco', 'JA16SJIS'); } $end_time = microtime_float(); echo ($end_time - $start_time) . 'sec<br>'; ?> <hr> <?php show_source($_SERVER['SCRIPT_FILENAME']);
です。このスクリプトを12回実行し、最大・最小の結果を除外した平均値を出してみました。以下の表の一番下が結果ですが。。。すごいですね、これ。10倍ですよ10倍!
指定なし(sec) | 指定あり(sec) | |
---|---|---|
1.150331974 | 0.094762087 | |
1.150527000 | 0.094940186 | |
1.151262045 | 0.094963074 | |
1.151454926 | 0.095012903 | |
1.151557207 | 0.095014095 | |
1.151857853 | 0.095139027 | |
1.152247906 | 0.095216036 | |
1.152394056 | 0.095256090 | |
1.152722120 | 0.095296860 | |
1.153656006 | 0.095352888 | |
1.154095173 | 0.095359087 | |
1.230126143 | 0.095589161 | |
平均値 | 1.152177429 | 0.095155025 |
うーん。環境変数から取ると、こんなにコストかかるのか。。。
その他connect関数(oci_connect、oci_new_connect)も同様にキャラクタセットを指定できるので、やっぱり同様なんでしょうかね。