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);
"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);
DartはDart 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にコンパイルされたDartもPerlと比較するとずいぶん速い。つまり、実用性からいうと十分な速度である。
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はすごい処理系だ。
[追記]
->> js -j loop.dart.js 500000500000 0.096 ->> js -j loop.js 500000500000 0.053
[/追記]