Php 这个基准测试脚本有什么问题?
我已经编写了一个小的php脚本来测试各种LAMP服务器的性能。我正在测试各种因素的速度,如磁盘I/O、数据库I/O等 在脚本中,我首先创建一个100KB的随机字符串,称为$payload 对于磁盘I/O检查,我使用文件\u put\u contents()将$payload写入磁盘1000次,这将在几毫秒内完成 其次,通过对sqlite检查使用相同的逻辑,我将在sqlite表中插入1000条$payload字符串记录。他们不应该花同样的时间吗?但是这个sqlite插入在everrr上继续。知道为什么吗Php 这个基准测试脚本有什么问题?,php,sqlite,Php,Sqlite,我已经编写了一个小的php脚本来测试各种LAMP服务器的性能。我正在测试各种因素的速度,如磁盘I/O、数据库I/O等 在脚本中,我首先创建一个100KB的随机字符串,称为$payload 对于磁盘I/O检查,我使用文件\u put\u contents()将$payload写入磁盘1000次,这将在几毫秒内完成 其次,通过对sqlite检查使用相同的逻辑,我将在sqlite表中插入1000条$payload字符串记录。他们不应该花同样的时间吗?但是这个sqlite插入在everrr上继续。知道为
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);
对于($i=0;$i),这只需要几毫秒。
{
对于($i=0;$i),它将持续运行一段时间。。。。。
{
$db=newsqlite3(“benchmark.db”);
$db->exec('create table temp(t text)');
对于($i=0;$iexec(“插入临时值(“{$payload}”)”);
};
}
$wtime=整轮((微时间(真)-$start)*1000);
当您不使用显式事务时,SQLite将在每条语句周围自动包装一个事务
为了保证事务的持久性,数据库必须在每个事务结束时将数据刷新到磁盘。
这意味着它将等待磁盘写入完成,然后再继续
要使数据库检查与磁盘检查类似,请在创建数据库后执行$db->exec(“pragma synchronous=off”)
但是,您不希望在真正关心数据丢失的数据库中使用此设置。
将$db->exec(“begin”)
和$db->exec(“commit”)
环绕在循环中,以便对所有写入操作使用单个事务。非常感谢!这就解决了问题(不幸的是,由于我还没有代表,所以我无法向上投票)。与3500个磁盘I/O相比,SQLite写入现在只需要3349毫秒。