Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sqlite/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 这个基准测试脚本有什么问题?_Php_Sqlite - Fatal编程技术网

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

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上继续。知道为

我已经编写了一个小的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毫秒。