Do You PHP はてブロ

Do You PHPはてなからはてブロに移動しました

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.

で、実際に試してみました。環境は

  • Xeon 3.2GHz x 2
  • Apache 2.0.55(src。古いです)+PHP 5.2.1(src)
  • Oracle 9.2.0.5.0 Standard Edition

な感じで、すべて同一サーバ上です。テストコードは、

<?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)も同様にキャラクタセットを指定できるので、やっぱり同様なんでしょうかね。