Node.jsと比べるとWSH(JScript)は170倍ぐらい遅い?(適当)

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

とりあえず簡単なベンチマーク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)

bench_node.js
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);
結果(0.015秒)
node C:\bench\bench_node.js
15
end: 1394515733630
start: 1394515733615

JScript (WSH Version 5.8)

bench_wsh.js
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);
結果(2.612秒)
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」でも使えます。

bench_rhino.js
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);
結果(0.867秒)
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から計算するのめんどい)

bench_ruby.rb
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}"
結果(1.345秒)
ruby C:\bench\bench_ruby.rb
1345
end: 1394519188624
start: 1394519187279

Benchmark使うバージョン (使わないほうよりちょっと遅い?)

bench_ruby2.rb
require 'benchmark'

a, MAX = 0, 10000000;

result = Benchmark.measure {
  MAX.times {|i| a += (i + 1 * 10 / 5)}
}

#出力
puts Benchmark::CAPTION, result
結果(1.39秒)
ruby C:\bench\bench_ruby2.rb
      user     system      total        real
  1.390000   0.000000   1.390000 (  1.388928)

Java (1.7.0)

比べるべきでは無いですが。
てかこれ何かおかしい?

Bench.java
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);
    }
}
結果(0.001秒)
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だった)