php - Node 与 PHP SQLite 性能对比(270 毫秒对比 70 毫秒)——我做错了什么吗?

标签 php node.js sqlite

更新:我回到最初的问题。见末尾的附录

我正在尝试测试 Node sqlite3 与 PHP 的读取性能,看看将一些代码移动到 Node 是否是一个可行的选择。这是我拥有的:

SQLite 3.8.7 installed on system
Node 0.10.29 with sqlite3 module (npm install sqlite3)
PHP 5.6.7 with PDO
Running on Debian 8.1

测试数据库

BEGIN TRANSACTION;
CREATE TABLE people(
  id integer primary key,
  name text,
  surname text
);
INSERT INTO "people" VALUES(1,'Elon','Musk');
INSERT INTO "people" VALUES(2,'Bill','Gates');
INSERT INTO "people" VALUES(3,'Steve','Jobs');
COMMIT;

Node 代码:

var sqlite3 = require('sqlite3').verbose();
var db = new sqlite3.Database('test.db');

db.serialize(function() {

  db.each("SELECT * FROM people", function(err, row) {
      console.log(row.id + ": " + row.name + " " + row.surname);
  });
});

db.close();

PHP代码:

<?php

$dbh  = new PDO('sqlite:test.db');
$query =  "SELECT * FROM people";
foreach ($dbh->query($query) as $row){
    echo "{$row['id']}: {$row['name']} {$row['surname']} \n";
}

?>

Node 结果:

$ time node test.js
1: Elon Musk
2: Bill Gates
3: Steve Jobs

real    0m0.281s
user    0m0.244s
sys     0m0.036s

PHP 结果:

$ time php test.php
1: Elon Musk 
2: Bill Gates 
3: Steve Jobs 

real    0m0.072s
user    0m0.060s
sys     0m0.012s

如您所见,PHP 版本的运行速度4 倍

SQLite 数据库具有默认设置。没有进行任何更改或调整。我只是想大致了解读取性能。测试在旧硬件上运行。

我不想挑起任何口水战。 我只想大致了解 Node 和 PHP 在此用例中的性能比较。我对 Node 没有太多经验,所以也许我做错了什么,实际上是在代码方面比较苹果和橘子。

感谢您花时间阅读本文。

更新代码以仅测量查询执行时间

Node :

var sqlite3 = require('sqlite3').verbose();
var db = new sqlite3.Database('test.db');

var preQuery = new Date().getTime();

db.serialize(function() {

  db.each("SELECT * FROM people", function(err, row) {
      console.log(row.id + ": " + row.name + " " + row.surname);
  });

});

var postQuery = new Date().getTime();
var duration = (postQuery - preQuery) / 1000;
console.log(duration);

db.close(); 

PHP:

<?php
$dbh  = new PDO('sqlite:test.db');
$query =  "SELECT * FROM people";

//place this before any script you want to calculate time
$preQuery = microtime(true); 

foreach ($dbh->query($query) as $row){
    echo "{$row['id']}: {$row['name']} {$row['surname']} \n";
}

$postQuery = microtime(true);
$duration = ($postQuery - $preQuery);
echo $duration . "\n";
?>

结果

PHP cli: 1.4ms
mod_php (Apache 2.4.10, opcache on): 0.7ms
Node: 3ms (but sometimes goes to 2ms)

据我所知,通过这个简单的测试。上面的 Node 代码是否有意义?

结论

我将尝试使用 Node 和 PHP 在 SQLite 之上制作小型 REST API 示例,并在更真实的场景中比较它们,在 Nginx 后面并在服务器硬件上运行。

Kenney 和 Jason,感谢您指出没有测试查询执行本身的明显错误。

不过,据我所知(考虑到我对 Node 的经验不足,我可能错得很离谱),PHP 在这个特定用例中似乎要快得多

附录

正如 Madara Uchiha 指出的,我的 Node 版本已经过时。所以我下载了最新的 Node (4.1.0 linux-x64) 和最新的 PHP (7.1.0-dev)。我运行上面的代码来测量查询执行时间,至少可以说我很惊讶。

结果如下:

Node 0.10.29          3ms (sometimes 2ms)
Node 4.1.0            6ms (sometimes 7ms)
PHP 5.6.7 CLI         1.4ms
PHP 7.1.0-dev CLI     0.7ms (average)

较新的 Node 版本运行速度慢 2 倍。为什么?! PHP 的速度提高了 2 倍。

新版本的 Node 速度如此之快的原因是什么?没有安装我尝试过的新版本的 Node 有什么不同,即在/usr/bin/node 中?我刚刚将存档提取到主目录并将 Node 添加到路径?这会以某种方式影响执行速度吗? home 目录和/usr/bin/node 都在同一个驱动器上,同一个分区,同一个用户。

所以,我回到原来的问题

我在这里对 Node 和 Sqlite3 做错了什么吗?或者在这个用例中 PHP 在数量级上优于 Node 是正常的吗?

最佳答案

您正在测量负载和 JIT 编译。配置文件在查询之前、加载之后开始。

关于php - Node 与 PHP SQLite 性能对比(270 毫秒对比 70 毫秒)——我做错了什么吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32678685/

相关文章:

php - 如何在 php 中从此 JSON 获取元素

php - 引用 - 这个错误在 PHP 中意味着什么?

PHP:一个类中的 $this 变量如何成为另一个类的对象?

javascript - 如何使用node.js正确使用/下载声音并通过客户端播放?

node.js - NodeJS 只监听本地主机

c# - 在 SQLite 中将 "String"存储为 "TEXT"而不是 "VarChar"- WP8

php - 创建一个报告,显示开始日期和结束日期之间每一天的具体统计数据

objective-c - 未知类型名称 sqlite3 错误

java - 在 Java 中读取 sql 文件和执行数据库插入时出现异常

javascript - 删除 Node js mysql查询中的斜线