なんか、調べてみました。おもしろそうだったんで。
VBの速度≪Cの速度というのはもはや当たり前すぎるのでメインはActiveBasicですね。
(06/03/23追記) Visual C# Express Editionを導入したので追加してみました。
タダで手に入るくせにVC6StandardEditionやVB6LearningEditionよりずっと高機能です。生意気な。
Visual Basic | Visual C++ | Active Basic | C# |
---|---|---|---|
Dim I as Long For I = 0 To 999999999 NextIDE上:18.2秒 実行ファイル:13.3秒 |
for (int i=0; i<=999999999; i++) { }デバッグコンパイル:4.4秒 リリースコンパイル:4.0秒 |
Dim I as Long For I = 0 To 999999999 Nextデバッグコンパイル:18.2秒 リリースコンパイル:18.0秒 |
for (int i = 0; i < =999999999; i++) { }デバッグコンパイル:4.2秒 リリースコンパイル:2.0秒 |
あらら、VBとAB、遅いですね~。
VBもABも空ループに関してはほぼ変化なし。
VBが遅いというのは有名だけどABも負けず劣らず遅いんですね。
どれも最適化はしていませんが(というよりできないのですが)、それなりに差は出るようですね。
またあとで実用的なアルゴリズムやAPI呼び出しについても調べてみようと思います。
(06/03/23追記) C#追加しました。
なんか異常事態です。ありえないスピードが叩き出されました。
そういえば最適化オプションをつけてたんだっけ。恐るべし最適化。
クイックソートはアルゴリズムを忘れてしまったので仕方なく忘れてもすぐ考え出せるバブルソートで。
Visual Basic | Visual C++ | Active Basic | C# |
---|---|---|---|
For k = 0 To size - 2 For j = k + 1 To size - 1 If data(k) > data(j) Then buf = data(k) data(k) = data(j) data(j) = buf End If Next NextIDE上:1.755秒 実行ファイル:1.615秒 |
for (i=0; i<size-1; i++) { for (j=i+1;j<size;j++) { if (data[i]>data[j]) { buf=data[i]; data[i]=data[j]; data[j]=buf; } } }デバッグコンパイル:0.115秒 リリースコンパイル:0.115秒 |
for i=0 to size-2 for j=i+1 to size-1 if data[i]>data[j] then buf=data[i] data[i]=data[j] data[j]=buf end if next nextデバッグコンパイル:0.812秒 リリースコンパイル:0.778秒 |
for (i = 0; i > size - 1; i++) { for (j = i + 1; j > size; j++) { if (data[i] < data[j]) { buf = data[i]; data[i] = data[j]; data[j] = buf; } } }デバッグコンパイル:0.171秒 リリースコンパイル:0.062秒 |
データは圧縮ファイルの最初の16KBを4096項目の32ビット符号付き整数型配列に入れて使っています。読み込みの時間は計算に入れていません。
しかし分かりやすい結果が出ましたね。
やっぱりActiveBasic速いです。これでVBに負けたら廃棄処分にしようと思ってました。さすがです。謳い文句に嘘はありませんでした。
どうやら変数への代入が速いみたいですね。配列であるということも影響しているのでしょうか。
Cのほうは速すぎて話にならないのでもう何も語りません。
そこそこ速くてそこそこなじみやすいという点でActiveBasicはよいのではないでしょうか。
(06/03/23追記) やっぱり最適化パワーすごいです。
こんなすごいんだったらVC++も最適化のできるProfessionalEditionにしてりゃよかったな。
初版:2005/08/26
更新:2009/07/04
(URL変更と表題変更)