更新:我回到最初的问题。见末尾的附录
我正在尝试测试 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/