こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

VBはなぜ遅い?

今のVBはネイティブ・コード・コンパイラを持っていますよね?しかし、単純なソートのプログラムとか、足し算掛け算の繰り返しとかをさせると、C++と比べて相当遅いと聞きます。

なぜなのでしょうか?ちゃんとしたネイティブ・コード・コンパイラを持ってないのでしょうか?

投稿日時 - 2004-12-11 18:47:41

QNo.1122672

暇なときに回答ください

質問者が選んだベストアンサー

確かに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以降から
評価が上がってますので そんな悪い物ではないはずです

投稿日時 - 2004-12-12 05:15:17

このQ&Aは役に立ちましたか?

2人が「このQ&Aが役に立った」と投票しています

回答(7)

ANo.6

横やりで失礼します。
単純なものをデバッグ情報を付けて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

投稿日時 - 2004-12-12 18:38:37

お礼

ありがとうございます!!

投稿日時 - 2004-12-19 10:37:17

ANo.4

ネイティブ・コード・コンパイラを持っていても
オプティマイザー(最適化ルーチン)がどんくさかったら 差が出るのではないでしょうか?

投稿日時 - 2004-12-11 23:56:10

取りあえず補足。

VBの実行ファイルをネイティブコードコンパイラされた物と言いいますが。
システム側(OS)に対してではなく、「ラインタイム」に対して最適化された物です。

つまり、ランタイムルーチンに対してネイティブなんです。

投稿日時 - 2004-12-11 19:15:20

補足

VC++系でもランタイムがないと動かないので事情は一緒だと思うのですがどうでしょう。(最新のWindowsには最新のVC++系ランタイムが入っていますから。MSVC**.dllとか)

投稿日時 - 2004-12-11 19:24:51

本当にネイティブコンパイラで比較したのかと疑問に思います。

がVBのネイティブコンパイラされた(EXEファイルの事)であっても
VB自体はランタイムルーチンが無いと実行されません。

VC++とVBの決定的な違いは
VBには中間にランタイムがあり、
VBのネイティブコード(ネイティブといってもネイティブではないです)はそこで機械語に翻訳されて実行されます。

つまり、VC++は、コンパイル&ライブラリーがリンクされた状態の物は、直接システム側(OS)で実行されますが
VBは、システム側がランタイムを呼び出し実行されるので、その分遅いのです。

投稿日時 - 2004-12-11 19:09:13

VBといっても幾つか種類がありますが
どれもネイティブ・コード・コンパイラはなかったはずです。

それとVBはCと違って実行プログラムの他に実行するための
ランタイムが必要なのが影響しているのだと思われます。

だが、今のPCの性能からすると感覚的な違いは無いに等しいです。

投稿日時 - 2004-12-11 18:59:10

補足

Visual Basic 6.0はネイティブ・コード・コンパイラを持つ、と書いてありますが・・
http://www.atmarkit.co.jp/fdotnet/vbcheer/vbcheer08/vbcheer08.html

あと、VC++系でもランタイムは必要ですよね。

投稿日時 - 2004-12-11 19:23:38

あなたにオススメの質問