スピードの問題
2006年3月15日
MySQL-SQLiteラッパーにおける、文字列エスケープ方法置換ルーチンのスピードについて
実行結果
やはり、for()文/while()文で回すより、strpos()でとばす方がかなり早い。PHPはインタープリタだから当たり前なのだろうけれど(Cなら逆の結果になるはず)。
備考:INSERT時のSQLiteのスピードの問題について。
<?php $s=''; for ($i=0;$i<65536;$i++) $s.=chr(rand(0x20,0x7e)); $t=microtime(); $i=0; while ($i<strlen($s)){ while ($s[$i]!='"' && $i<strlen($s)) if ($t[$i++]=='\\') $i++; $i++; } if (($t=microtime()-$t)<0) $t=$t+1; echo (string)$t.''; $t=microtime(); $i=0; while ($i<strlen($s)){ while ($s[$i]!='"' && $i<strlen($s)) { if (!($j=strpos($t,'"',$i))) { $i=strlen($s); break; } if (($k=strpos($t,"\\",$i))<$j) { $i=$k+2; continue; } $i=$j; break; } $i++; } if (($t=microtime()-$t)<0) $t=$t+1; echo (string)$t.''; ?>
実行結果
0.184374 2.5E-05
やはり、for()文/while()文で回すより、strpos()でとばす方がかなり早い。PHPはインタープリタだから当たり前なのだろうけれど(Cなら逆の結果になるはず)。
備考:INSERT時のSQLiteのスピードの問題について。
sqlite_query($con, "begin;"); $start = getmicrotime(); for ($i=$j+1; $i<$lines; $i++) { $sql = sprintf("insert into t1 values(%d);", $i); sqlite_query($con, $sql); } $elapsed = getmicrotime() - $start; sqlite_query($con, "commit;");のように、トランザクションの開始と終了を明示してやると、速度が大幅に改善されることがあるらしい。