- ベストアンサー
VBはなぜ遅い?
今のVBはネイティブ・コード・コンパイラを持っていますよね?しかし、単純なソートのプログラムとか、足し算掛け算の繰り返しとかをさせると、C++と比べて相当遅いと聞きます。 なぜなのでしょうか?ちゃんとしたネイティブ・コード・コンパイラを持ってないのでしょうか?
- みんなの回答 (7)
- 専門家の回答
質問者が選んだベストアンサー
確かにWindows用のC言語ランタイムは存在はします<でないと完全にアセンブリ言語になっちゃうので・・・ VBとVCが違うのは、 VCのコンパイルされた物は、直接Windows側で「理解」ができる状態。<MFC調のC言語とかは別ですよ。なんで理解できるか?と言えば、C言語のランタイムがありWindows自体も殆どがC言語で作られている から・・・ VBのコンパイルされた物は、C言語のランタイムでは 直接「理解」が出来ない状態です。 なので一旦、VBランタイムがWindows側で処理 できるように翻訳しなおしているので、どうしてもC言語より処理数が多いのです。 ようは、OSの基本がC言語系でつくられていますから 他の言語(アセンブリ言語は除きます)だとどうしても言語間の翻訳機が必要なのです。 なのでありえない事ですが Windowsが仮にVB言語系で作られたとしたら 逆にC言語は遅くなります。<C言語自体のスピードではなく、言語間の翻訳処理で処理数が増えるから。 ************************** いや、早い話、VBのEXE成果物が、C++調に なっていれば早いのですが<VBランタイムが必要でなくなるから VBの出た最初の理由が「教育目的」であり「実運用」用ではないので、VBランタイムを必要とする仕様になったんだと思います で・・・そのままの流れで今にいたったのだと。 (だから、c#なんて物が出来たのかと・・・) ちなみに、VBのオプティマイザはVB5.0以降から 評価が上がってますので そんな悪い物ではないはずです
その他の回答 (6)
- taka_tetsu
- ベストアンサー率65% (1020/1553)
- hope10
- ベストアンサー率48% (17/35)
横やりで失礼します。 単純なものをデバッグ情報を付けてVC++で見てみました。 (すぐにオーバーフローしますが...) 後半以降がVCで見たアセンブリコードです。 (関数内の前後は略... かなり冗長) これを見る限りそんなに悪くないと思います。 ですから実践で遅い理由はAruku-20030515さんが説明されている通りですよ。 Form1.frm ------------------------------------- Private Sub Command1_Click() Dim i As Long Dim j As Long Dim k As Long Dim lVar As Long For i = 0 To 2147483647 For j = 0 To 2147483647 For k = 0 To 2147483647 lVar = lVar + 1 Next k Next j Next i End Sub アセンブリ ----------------------------------- 28: Private Sub Command1_Click() 29: 30: Dim i As Long 31: Dim j As Long 32: Dim k As Long 33: 34: Dim lVar As Long 35: 36: 37: For i = 0 To 2147483647 00401A55 xor ecx,ecx 38: For j = 0 To 2147483647 00401A57 mov eax,7FFFFFFFh 00401A5C mov dword ptr [i],ecx 00401A5F cmp ecx,eax 00401A61 jg Form1::Command1_Click+0B9h (00401ab9) 00401A63 xor edi,edi 39: For k = 0 To 2147483647 00401A65 mov eax,7FFFFFFFh 00401A6A cmp edi,eax 00401A6C jg Form1::Command1_Click+0A5h (00401aa5) 00401A6E mov esi,eax 00401A70 mov ecx,1 00401A75 xor eax,eax 40: lVar = lVar + 1 00401A77 cmp eax,esi 00401A79 jg Form1::Command1_Click+92h (00401a92) 00401A7B add edx,1 00401A7E mov ebx,ecx 00401A80 jo $L71+1Fh (00401b67) 00401A86 add ebx,eax 00401A88 jo $L71+1Fh (00401b67) 00401A8E mov eax,ebx 00401A90 jmp Form1::Command1_Click+77h (00401a77) 39: For k = 0 To 2147483647 00401A92 mov eax,1 00401A97 add eax,edi 00401A99 jo $L71+1Fh (00401b67) 00401A9F mov edi,eax 00401AA1 xor ebx,ebx 00401AA3 jmp Form1::Command1_Click+65h (00401a65) 38: For j = 0 To 2147483647 00401AA5 mov ecx,dword ptr [i] 00401AA8 mov eax,1 00401AAD add eax,ecx 00401AAF jo $L71+1Fh (00401b67) 00401AB5 mov ecx,eax 00401AB7 jmp Form1::Command1_Click+57h (00401a57) 41: Next k 42: Next j 43: Next i 44: 45: End Sub 00401AB9 mov ecx,80020004h 00401ABE mov eax,0Ah
- deecyan
- ベストアンサー率38% (89/233)
ネイティブ・コード・コンパイラを持っていても オプティマイザー(最適化ルーチン)がどんくさかったら 差が出るのではないでしょうか?
- Aruku-20030515
- ベストアンサー率23% (362/1544)
取りあえず補足。 VBの実行ファイルをネイティブコードコンパイラされた物と言いいますが。 システム側(OS)に対してではなく、「ラインタイム」に対して最適化された物です。 つまり、ランタイムルーチンに対してネイティブなんです。
補足
VC++系でもランタイムがないと動かないので事情は一緒だと思うのですがどうでしょう。(最新のWindowsには最新のVC++系ランタイムが入っていますから。MSVC**.dllとか)
- Aruku-20030515
- ベストアンサー率23% (362/1544)
本当にネイティブコンパイラで比較したのかと疑問に思います。 がVBのネイティブコンパイラされた(EXEファイルの事)であっても VB自体はランタイムルーチンが無いと実行されません。 VC++とVBの決定的な違いは VBには中間にランタイムがあり、 VBのネイティブコード(ネイティブといってもネイティブではないです)はそこで機械語に翻訳されて実行されます。 つまり、VC++は、コンパイル&ライブラリーがリンクされた状態の物は、直接システム側(OS)で実行されますが VBは、システム側がランタイムを呼び出し実行されるので、その分遅いのです。
VBといっても幾つか種類がありますが どれもネイティブ・コード・コンパイラはなかったはずです。 それとVBはCと違って実行プログラムの他に実行するための ランタイムが必要なのが影響しているのだと思われます。 だが、今のPCの性能からすると感覚的な違いは無いに等しいです。
補足
Visual Basic 6.0はネイティブ・コード・コンパイラを持つ、と書いてありますが・・ http://www.atmarkit.co.jp/fdotnet/vbcheer/vbcheer08/vbcheer08.html あと、VC++系でもランタイムは必要ですよね。
お礼
ありがとうございます!!