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

  • 16
    いいね
  • 2
    コメント
この記事は最終更新日から1年以上が経過しています。

追記: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