追記: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
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のみのベンチ)