JavaScript の処理速度が予想以上に速くなってきている。最近、スマートフォン用のアプリケーションをどうするか試行錯誤していたがその際の正直な実感だ。熾烈なブラウザー競争の結果 JavaScript の JIT コンパイラーが優秀になってきているのが原因だろう。
「俺の言語がこんなに遅いわけがない!? 〜C, Java, PHP, Python, Rubyによるプログラミング言語 速度比較〜」というブログの記事の結果に、C# と JavaScript の処理時間を追加すると以下のようなグラフになる。プログラム言語の処理速度は、C < C# ≒ Java < JavaScript << PHP のようだ。
JavaScript に数値を入れていないのは、同じ計測方法がとれなかったためで、概略で図を描いたもので詳しくは下で説明している。この結果は、プログラミング言語についての計算速度を測定するサイトである Computer Language Benchmarks Game の JavaScript と PHP を比較したデータを一番下に示しているが、処理速度に大きな差があるので概略値としては間違っていないと思っている。
普通の Web サイトでは、数値計算を大量にすることは殆どなくて、データベースとのやり取りや文字列処理が中心なので、PHP 等のスクリプト言語でも十分に実用的である。しかし、ユーザーインターフェースを本当によくしようと思えば、計算量が飛躍的に増大するので、プログラム言語の選択は重要になってきている。
巷では PHP が人気のようだが、これから新しくプログラム言語を覚えるのであれば JavaScript の方がお勧めだと思うのだがどうだろうか。JavaScript の方が速度的にも遙かに優位だし、PHPだけではリッチなクライアントのプログラムをすることは不可能で、結局は JavaScript を使わないといけなくなる。一方、JavaScript だとクライアントでの親和性は抜群だし、サーバー側でも node.js を使えるので、JavaScript だけを覚えればサーバー側もクライアント側もそれだけで処理ができてしまう。
そういえば、PHP も JIT を実装する方向で動いているようだ。やはり処理速度は重要だということだろう。
- マイナビニュース: PHP、"次世代PHP"の開発を開始 - JIT実装に向けコアAPIも変更
- PHP.net: PHP Next Generation
最後に処理時間の計測方法についてメモしておく。C#については、「俺の言語がこんなに遅いわけがない!? 〜C, Java, PHP, Python, Rubyによるプログラミング言語 速度比較〜」の例にならって、以下のコンソールアプリケーションのプログラムを書いた。
class Program { private const int N = 10000; static void Main(string[] args) { Console.WriteLine("C# start."); var sw = new Stopwatch(); sw.Start(); var result = new int[N]; for (int count = 1; count <= N; count++) result[count - 1] = SumUp(count); sw.Stop(); Console.WriteLine(sw.ElapsedMilliseconds + "ミリ秒"); Console.WriteLine("C# end."); } static int SumUp(int n) { int sum = 0; for (int i = 1; i <= n; i++) sum += i; return sum; } }
C#は、マイクロソフトが開発したプログラム言語で、Java や Delphi の影響を受けているといわれており 2000年に登場した比較的新しい言語である。マイクロソフトの言語と思われているが、ISO で標準化されており、最近では、Mono や Xamarin によって、Linux、Mac、iPhone、Android 等でも動作する。
テスト環境は、例と同じくアマゾン・ウェブサービス(AWS)の t1.micro インスタンスを使ったが、Linux ではなくて、Windows Sever 2008 の 32ビット版を使用した。Linux のように単純に time コマンドで時間を計測はできないので、PowerShell のスクリプトを次のように作成して起動させて時間を計測した。
$wmi = Get-WmiObject -Class Win32_OperatingSystem echo $wmi.LocalDateTime .\ProgramTest.exe $wmi = Get-WmiObject -Class Win32_OperatingSystem echo $wmi.LocalDateTime
測定結果は、実行時間が161ミリ秒で、計算部分だけだと53ミリ秒だった。例のJavaの場合、集計に long を使っているので、C# でも sum を int から long に変更すると、実行時間が187ミリ秒になり、Java より少し遅いという結果になった。C# と Java は処理方法が似ているので実行時間もほぼ同じということになると思われる。
次に、JavaScript の実行時間の計測だが、例の方法に準じてテストをするには node.js をインストールしてテストするのがいいと思ったが、今興味があるのはブラウザーでの処理なので、計算部分の処理時間だけで C# と比較することにした。
JavaScript に関しては、以下のページに公開しているので、ソースはそちらを見てください。また、実際にテストもできます。
自分のPCだと計算時間は、C#の場合で13ミリ秒、Chrome、IE11はともに 42ミリ秒~100ミリ秒で計算時間は安定していない。iPhone の場合は、C#73ミリ秒、Safari は約282ミリ秒だった。計算部分の処理時間については、概ねC#の4倍といったところだと思う。JavaScriptの場合は、計算部分の前後の処理については、下にPCの場合のタイムラインを表示しておくけどそれほど時間は要さないと考えられる。
なお、例の方のグラフでは、C の実行時間は255ミリ秒となっているが、Cで最適化オプションをつけてコンパイルすると58ミリ秒になったという記載があるのでそちらを採用している。
Computer Language Benchmarks Game での JavaScript と PHP の処理時間の比較