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

追記：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
<?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

```perl
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

```text
 |  同時並行性 | 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の同時

```text
 |  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