JSにコンパイルされたDartがPerlより速い件

Dartのインストールが簡単になっていたので試してみたところ、Perlよりも高速だった。

なにこれ悔しい。

Dart:

void main() {
  final t = new Stopwatch();
  t.start();

  final a = new List<int>();
  
  for(var i = 0; i < 1000000; ++i) {
    a.add(i);
  }
  for(var i = 0; i < a.length; ++i) {
    ++a[i];
  }
  
  var sum = 0;
  for(var i = 0; i < a.length; ++i) {
    sum += a[i];
  }

  print(sum);
  print(t.elapsedMilliseconds / 1000);
}

Perl:

use 5.12.0;
use Time::HiRes qw(gettimeofday tv_interval);

my $t0 = [gettimeofday()];

my @a;

for(my $i = 0; $i < 1000_000; ++$i) {
    push @a, $i;
}
for(my $i = 0; $i < scalar(@a); ++$i) {
    ++$a[$i];
}
my $sum = 0;
for(my $i = 0; $i < scalar(@a); ++$i) {
    $sum += $a[$i];
}
say $sum;
say tv_interval($t0);

JavaScript:

"use strict";

var t0 = Date.now();

var a = new Array();

for(var i = 0; i < 1000000; ++i) {
    a.push(i);
}
for(    i = 0; i < a.length; ++i) {
    ++a[i];
}
var sum = 0;
for(    i = 0; i < a.length; ++i) {
    sum += a[i];
}

console.log(sum);
console.log( (Date.now() - t0) / 1000);

DartDart SDKの中のbin/frogcでJSにコンパイルしてnode.js v0.6.11 (MacBook Air, Lion)で実行した。

結果:

->> dart loop.dart # Dart SDKのnativeな処理系
500000500000
0.461644

->> node loop.dart.js 
500000500000
0.164

->> perl loop.pl
500000500000
0.445433

->> node loop.js
500000500000
0.051

node.jsが圧倒的だが、JSにコンパイルされたDartPerlと比較するとずいぶん速い。つまり、実用性からいうと十分な速度である。
dart(1)で直接実行するとほぼPerlと同じ水準なので、これはV8の速度の凄まじさがよく分かる結果でもある。

おまけ:
homebrewでインストールできるSpiderMonkeyでも試してみた。そのままでは実行できなかったのでs/console.log/print/として実行:

->> js loop.dart.js 
500000500000
3.777

->> js loop.js
500000500000
0.542

素のjsはPerlと同じ水準で、普通のスクリプト言語はこんなものなのだろう。やはりV8はすごい処理系だ。

[追記]

デフォルトでJITが無効と知らなかったのでJITを有効にしてやってみたところ、素のJSでV8に引けを取らないだけでなくJSにコンパイルしたDartもV8で実行するより高速だった。SpiderMonkeyも侮れない。

->> js  -j loop.dart.js 
500000500000
0.096

->> js -j loop.js
500000500000
0.053

[/追記]