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

[とりあえず簡単なベンチマークNode.js,PHP,Perl](http://qiita.com/toshirot/items/d304cd2998dd4136f7a4)

ここを見て、同じく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)

```js: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);
```

```dos:結果(0.015秒)
node C:\bench\bench_node.js
15
end: 1394515733630
start: 1394515733615
```

##JScript (WSH Version 5.8)

```js: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);
```

```dos:結果(2.612秒)
cscript //nologo C:\bench\bench_wsh.js
2612
end: 1394518930038
start: 1394518927426
```

##Rhino (1.7R4)

Javaで作られたJavaScriptエンジン。
GASはRhinoを使ってるというウワサがあるようです。
参考: [GoogleAppsScriptのメモ - Web系がおもしろい。](http://d.hatena.ne.jp/esperia/20120407/1333805736)

ここからダウンロードできます。
[Download Rhino - Rhino | MDN](https://developer.mozilla.org/en-US/docs/Rhino/Download_Rhino)

JDKが入ってれば「jrunscript」でも使えます。

```js: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);
```

```dos:結果(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から計算するのめんどい)

```rb: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}"
```

```dos:結果(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
```


```dos:結果(1.39秒)
ruby C:\bench\bench_ruby2.rb
      user     system      total        real
  1.390000   0.000000   1.390000 (  1.388928)
```

##Java (1.7.0)
比べるべきでは無いですが。
てかこれ何かおかしい？

```java: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ファイルを逆コンパイルしてみたらこうなってました。

```java
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だった)