Edited at

とりあえず簡単なベンチマークNode.js,PHP,Perl

More than 5 years have passed since last update.

追記:2013/03/12 v0.4.12, v0.7.12, v0.9.0, v0.9.10, v0.10.0 のテストを追加

とりあえず、というのは「とりあえずビールね!」という軽い感じのという意味で、今日は、Node.jsではありがちなベンチマークです。

まぁ、自分で試さないと気が済まないので、軽い感じの演算ベンチマークテストをやってみました。

PerlとPHPは結構しばらく使ってなかったので、あれ?あれ?などと言いながら書きました^^;。ミスがあったら突っ込んでください。少しでも正しい値が知りたいので。

まぁ、言うまでもありませんが、ベンチはあくまでベンチなので、ひとつの目安にしか過ぎませんので、そこのところはあしからず。。。


テストマシン

テストに使ったのはこないだ作ったリーズナブルマシンです。

OS Ubuntu 12.04 LTS (GNU/Linux 3.2.0-29-generic-pae i686)

ベアボーンキット Shuttle XH61V ¥16,800
メモリ TRJ JM1333KSN-8GK(SODIMM DDR3 PC3-10600 4GBx2) ¥3,170
CPU Intel Core i3-2120 BOX (1155/3.30/3M/C2/T4) ¥9,760
SSD OCZSSD2-1VTXPL60G ¥5,980
----------------------------------------------
合計 35,710円


テストコード

ベンチ用のコードは下記の通り。演算自体に意味はありません。これを1千万回繰り返した場合は何msかかるか?という計測です。*console.time、console.timeEndは、他となるべく揃えるためにあえて使ってません。


Node.js

v0.8.8


Node.js

var i,a = 0, max = 10000000;

var start = Date.now();

for (i = 0; i < max; i++) {
a += (i + 1 * 10 / 5) ;
}

var end = Date.now();
console.log(end - start);
console.log('end: ' + end);
console.log('start: ' + start);



PHP

PHP 5.3.10-1ubuntu3.2 with Suhosin-Patch (cli)

<?php

$i = null;
$a = 0;
$max = 10000000;

$start = microtime(true)*1000;

for ($i = 0; $i < $max; $i++) {
$a += ($i + 1 * 10 / 5) ;
}
$end = microtime(true)*1000;
var_dump($end - $start);
var_dump('end: '.$end);
var_dump('start: '.$start);
var_dump('a: '.$a);
?>


Perl

perl 5, version 14, subversion 2 (v5.14.2) built for i686-linux-gnu-thread-multi-64int

use Time::HiRes;

$i = null;
$a = 0;
$max = 10000000;

$start = Time::HiRes::time * 1000;

for ($i = 0; $i < $max; $i++) {
$a += ($i + 1 * 10 / 5) ;
}
$end = Time::HiRes::time *1000;
print($end - $start);
print("\n"."end: ".$end);
print("\n"."start: ".$start);
print("\n"."a: ".$a);


結果

単位 ミリ秒(1/1000秒)

結果はこうでした。Perlが意外でしたが、まぁ1千万回繰り返してのミリ秒単位ですから決して遅くはないです。

項目   一回目, 二回目, 三回目, 四回目, 五回目

Node 17, 16, 17, 17, 17

PHP 909, 901, 902, 900, 904

Perl 1792, 1795, 1804, 1808, 1783


出力サンプル

Node

17
end: 1346492667034
start: 1346492667017
a: 50000015000000

PHP

float(909.15283203125)
string(20) "end: 1346493654404.8"
string(22) "start: 1346493653495.6"
string(17) "a: 50000015000000"

Perl

1795.85009765625
end: 1346493732819.79
start: 1346493731023.94
a: 50000015000000


Node.jsのバージョン毎にはどうなの?

こうなりました。バージョンアップ毎に確実に速くなっているようですが、このベンチでは、v0.7.12以降はほぼ止まってます。まぁ、こういう基本的な演算性能はもうあまり変わらないのかな?

ちなみに、v0.10.0 ではHTTP, FS, TLSで早くなったとアナウンスされています。http://blog.nodejs.org/2013/03/11/node-v0-10-0-stable/

項目    一回目, 二回目, 三回目, 四回目, 五回目

v0.10.0 17, 17, 17, 17, 17

v0.9.10 16, 16, 17, 17, 16

v0.9.0 17, 17, 17, 17, 17

v0.8.8 17, 16, 17, 17, 17 <-上記テストバージョン

v0.7.12 16, 17, 17, 17, 16

v0.6.18 19, 19, 19, 19, 19

v0.5.0 36, 29, 33, 33, 33

v0.4.12 30, 32, 31, 33, 34


Node関連ベンチマークリンク


Node.js vs PHP Performance – Maths

http://www.matt-knight.co.uk/2011/node-js-vs-php-performance-maths/

>PHPより50倍速かった


文字列結合のベンチマークをいろんな処理系でやってみた

http://www.slideshare.net/kwatch/ss-8933694/7

>V8(+crankshaft)の速度は他の処理系が泣いて土下座するレベル


node-js-vs-apache-php-benchmark

http://code.google.com/p/node-js-vs-apache-php-benchmark/wiki/Tests

>並行性bencmark

 |  同時並行性 | 100 | 200 | 400 | 800 | 

|:-------|--------:|:--------:|
| ApacheのPHP | 6.337 | 6.955 | 6.723 | 19.232 |
| nodeJS | 3.461 | 3.284 | 3.721 | 3.689 |

>100リクエスト、100の同時

 |  X  |  1 | 2 | 3 | 4 | 5 | 

|:-------|--------:|:--------:|
| ApacheのPHP | 38.359 | 37.930 | 37.058 | 37.441 | 36.704 |
| nodeJS | 3.798 | 3.740 | 3.856 | 3.755 | 3.878 |


デブサミ2012 16-A-5 レポート

http://codezine.jp/article/detail/6461

>Perl、Python、PHP、Rubyよりも約10倍速い。


Node.js の Cluster のベンチマークをとってみた(Nodeのみのベンチ)

http://hakobera.hatenablog.com/entry/20111111/1320994609