スピードの問題
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;");のように、トランザクションの開始と終了を明示してやると、速度が大幅に改善されることがあるらしい。