节点vs PHP SQLite性能(270ms vs 70ms) – 我做错了什么?

更新:我回到原来的问题。 最后见附录

我试图testing节点sqlite3读取性能与PHP,看看是否移动一些代码到节点是一个可行的select。 这是我有:

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 

testing数据库

 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; 

节点代码:

 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"; } ?> 

节点结果:

 $ 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数据库是默认设置。 没有改变或调整已经完成。 我只想得到一个读取性能的总体思路。 testing在旧硬件上运行。

我不想开始任何火焰战争。 我只想了解一下Node和PHP在这个用例中的性能比较 。 我没有太多的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) 

据我所知,这个简单的testing。 上面的节点代码是否有意义?

结论

我将尝试使用Node和PHP在SQLite之上创build一个小的REST API示例,并将其作为比较真实的场景,在Nginx后面并在服务器硬件上运行。

肯尼和杰森,谢谢你指出一个明显的错误不testing查询执行本身。

尽pipe如此,据我所知(我可能是错误的,因为我缺乏Node的经验), 在这个特定的用例中PHP似乎要快得多

附录

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

结果如下:

 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) 

较新的节点版本运行慢两倍。 为什么?! 而PHP快了两倍。

新版本的Node如此戏剧性的下滑,原因是什么? 它是否有任何区别,我试过的新版本的节点没有安装,即在/ usr / bin /节点? 我只是提取存档到家庭目录,并添加到PATH节点? 这能否以某种方式影响执行的速度? home dir和/ usr / bin / node都位于同一个驱动器,同一个分区,同一个用户。

所以,我回到原来的问题

我在这里做Node和Sqlite3错误吗? 或者这个用例中的PHP比Node要好几个数量级?

你正在测量负载和JIT编译。 configuration文件在查询之前,加载之后开始。

我知道我迟到了。 如果您不需要详细的堆栈跟踪,请不要使用它:

 var sqlite3 = require('sqlite3'); 

代替

 var sqlite3 = require('sqlite3').verbose(); 

在你的代码的一个小testing它得到6倍更快,所以可能比PHP更快。 尽pipe如此,您应该尽量利用NodeJS的最佳function:asynchronousI / O。