这个基准测试脚本有什么问题?

时间:2014-06-12 16:03:19

标签: php sqlite

我已经编写了一个小的PHP脚本来对我们各种LAMP服务器的性能进行基准测试。我正在测试各种因素的速度,如磁盘I / O,数据库I / O等。

在脚本中,我首先创建一个名为$ payload的随机字符串100KB。

对于磁盘I / O检查,我使用file_put_contents()将$ payload写入磁盘1000次,并在几毫秒内完成。

其次,通过对sqlite检查使用相同的逻辑,我在sqlite表中插入1000个$ payload字符串的记录。他们不应该花费相同的时间吗?但这个sqlite插件继续进行。知道为什么吗?

for($i=0;$i<100000;$i++) //generate a big string
{
    $n=rand(0,57)+65;
    $payload = $payload.chr($n);
}
//write test:
$start = microtime(true);
    if ($type=='disk') // Disk I/O -> This takes only a few msecs.
    {
        for($i=0;$i<1000;$i++) file_put_contents($fname,$payload);
    }
    else if ($type=='sqlite') //sqlite test -> This keeps running for everrrrrr.....
    {
        $db = new SQLite3("benchmark.db");
        $db->exec('create table temp(t text)');
        for($i=0;$i<1000;$i++) {
            $db->exec("insert into temp values('{$payload}')");
            };

    }
$wtime=round((microtime(true) - $start)*1000);

1 个答案:

答案 0 :(得分:2)

当您不使用显式事务时,SQLite将围绕每个语句包装自动事务。

为了保证事务是持久的,数据库必须在每次事务结束时将数据刷新到磁盘。 这意味着它在继续之前等待磁盘写入完成。

要使数据库检查与磁盘检查类似,请在创建数据库后执行$db->exec("pragma synchronous = off")

但是,您不希望在您关心数据丢失的真实数据库中使用此设置。 在循环中包裹$db->exec("begin")$db->exec("commit")以对所有写入使用单个事务。