Nucleus/SQLite

スピードの問題

2006年3月15日

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

コメント

コメントはありません

コメント送信