我已经编写了一个小的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);
答案 0 :(得分:2)
当您不使用显式事务时,SQLite将围绕每个语句包装自动事务。
为了保证事务是持久的,数据库必须在每次事务结束时将数据刷新到磁盘。 这意味着它在继续之前等待磁盘写入完成。
要使数据库检查与磁盘检查类似,请在创建数据库后执行$db->exec("pragma synchronous = off")
。
但是,您不希望在您关心数据丢失的真实数据库中使用此设置。
在循环中包裹$db->exec("begin")
和$db->exec("commit")
以对所有写入使用单个事务。