とりあえず簡単なベンチマークNode.js,PHP,Perl
ここを見て、同じくJavaScriptベースのJScriptの速度が気になったので試してみました。
あくまで目安だし、Node.jsが速い速いとは聞いてたけど、ここまで違うとは思わなかったのでメモ。
(コードの最適化ってよく知らないけど、まさかそもそもループしてなかったりするのかな..速すぎて謎)
ついでにJava製JavaScriptエンジンのRhinoも。
ついでのついでにRubyとJavaも。
環境
OS: Windows 8.1
CPU: Intel Core i5 3470 3.20GHz
メモリ: CMZ8GX3M2A1600C9
SSD: THNSNH128GCST
比較
Node.js (v0.11.10)
var a = 0, MAX = 10000000;
var start = Date.now();
for (var i = 0; i < MAX; i++) {
a += (i + 1 * 10 / 5) ;
}
var end = Date.now();
//出力
console.log("%d\nend: %d\nstart: %d", end - start, end, start);
node C:\bench\bench_node.js
15
end: 1394515733630
start: 1394515733615
JScript (WSH Version 5.8)
var a = 0, MAX = 10000000;
var start = new Date();
for (var i = 0; i < MAX; i++) {
a += (i + 1 * 10 / 5) ;
}
var end = new Date();
//出力
start_time = start.getTime();
end_time = end.getTime()
WScript.Echo(end_time - start_time, '\nend: ' + end_time, '\nstart: ' + start_time);
cscript //nologo C:\bench\bench_wsh.js
2612
end: 1394518930038
start: 1394518927426
Rhino (1.7R4)
Javaで作られたJavaScriptエンジン。
GASはRhinoを使ってるというウワサがあるようです。
参考: GoogleAppsScriptのメモ - Web系がおもしろい。
ここからダウンロードできます。
Download Rhino - Rhino | MDN
JDKが入ってれば「jrunscript」でも使えます。
var a = 0, MAX = 10000000;
var start = new Date();
for (var i = 0; i < MAX; i++) {
a += (i + 1 * 10 / 5) ;
}
var end = new Date();
//出力
start_time = start.getTime();
end_time = end.getTime()
print(end_time - start_time, '\nend: ' + end_time, '\nstart: ' + start_time);
java -classpath C:\bench\js.jar org.mozilla.javascript.tools.shell.Main C:\bench\bench_rhino.js
867
end: 1394519115569
start: 1394519114702
Ruby (2.0.0p353)
UNIX時間のミリ秒を取り出すメソッドがないので、一回文字列にしてます。(usecから計算するのめんどい)
a, MAX = 0, 10000000;
start = Time.now
MAX.times {|i| a += (i + 1 * 10 / 5)}
en = Time.now
# 出力
start_time = start.strftime("%s%L").to_i
end_time = en.strftime("%s%L").to_i
puts end_time - start_time, "end: #{end_time}", "start: #{start_time}"
ruby C:\bench\bench_ruby.rb
1345
end: 1394519188624
start: 1394519187279
Benchmark使うバージョン (使わないほうよりちょっと遅い?)
require 'benchmark'
a, MAX = 0, 10000000;
result = Benchmark.measure {
MAX.times {|i| a += (i + 1 * 10 / 5)}
}
# 出力
puts Benchmark::CAPTION, result
ruby C:\bench\bench_ruby2.rb
user system total real
1.390000 0.000000 1.390000 ( 1.388928)
Java (1.7.0)
比べるべきでは無いですが。
てかこれ何かおかしい?
public class Bench {
public static void main(String[] args) {
int a = 0, MAX = 10000000;
long start = System.currentTimeMillis();
for (int i = 0; i < MAX; i++)
a += (i + 1 * 10 / 5);
long end = System.currentTimeMillis();
System.out.printf("%d\nend: %d\nstart: %d", end - start, end, start);
}
}
1
end: 1394516355104
start: 1394516355103
2014/3/12 追記
.classファイルを逆コンパイルしてみたらこうなってました。
public static void main(String[] args)
{
int a = 0;int MAX = 10000000;
long start = System.currentTimeMillis();
for (int i = 0; i < MAX; i++) {
a += i + 2;
}
long end = System.currentTimeMillis();
System.out.printf("%d\nend: %d\nstart: %d", new Object[] { Long.valueOf(end - start), Long.valueOf(end), Long.valueOf(start) });
}
結果まとめ
単位はミリ秒。
環境|1回目|2回目|3回目|4回目|5回目|
:--|--:|--:|--:|--:|--:|--:|--:|--:|
Node.js|14|15|15|15|15
JScript|2612|2621|2623|2628|2673
JavaScript (Rhino)|867|880|892|861|867
Ruby|1345|1345|1345|1344|1344
Node.jsが0.015秒、JScriptが2.612秒だったので、適当計算で174倍ほど。
Rhinoが思ったより速かった。
Javaは何か、測定結果がおかしい気がしてきたので除外 (5回とも1だった)