【Colum】


Visual Basic の計算処理
 Visual Basicでアプリケーションを作る場合、まず問題になるのが処理速度の問題 です。とにかく遅い,遅いといわれるVisual Basic。本当に遅いのでしょうか?計算方法、 処理する内容によって正確に比べることは難しいですが、ここでは、Visual BasicとVisual C++ について単純な計算の処理能力を検証してみます。


 Visual Basic(Visual Basic4.0),Visual C++(Visual C++6.0)プログラム(バージョンが違うため 正確に判定はできません)での単純な計算をする時間を測ります。誤差を少なくするため、ループ回数を 1000万回としました。それぞれ、加,減,乗,除算を単独で行い、最後に 加減乗除算をセットで行いました。
以下のコードは加減乗除算セット時。

  Dim i As Long
  Dim a As Integer, b As Integer
  Dim Ans As Integer
  a = 16: b = 8
  t0 = Timer
  For i = 0 To 10000000
    Ans = a + b
    Ans = a - b
    Ans = a * b
    Ans = a \ b
  Next i
  MsgBox "所要時間: " & Format(Timer - t0, "##0.00") & " sec"
参考コード(Visual Basic)

  char buf2[100];
  long t0,t1;
  long i;
  int a,b;
  int Ans;
  a = 16; b = 8;
  t0= GetTickCount();
  for (i=0;i<10000000;i++) {
    Ans = a + b;
    Ans = a - b;
    Ans = a * b;
    Ans = a / b;
  }
  t1 = GetTickCount();
  wsprintf(buf2,"%ld",t1-t0);
  MessageBox(hWnd,buf2,NULL,MB_OK);
参考コード(Visual C++)


(計測結果-1000万回)
言語加算減算乗算除算加減乗除算
VB9.169.1610.1611.4127.28
VC0.780.791.334.425.64
*単位は秒
計測条件−Pentium133,32MB


 加減算では、10倍以上の処理速度の差が見られますが、除算では、3倍弱 で、予想されたものより差はありません。なお除算については、計算方式が違うため 正確に比べることは不可能です。(Visual Basicで / 演算子を使うと、浮動小数点を返してし まう。\ 演算子は整数を返す。C言語では、 / 演算子は、小数点以下の切り捨 てなどの「丸め」処理をする。)
 単純にそれぞれの加,減,乗,除算にかかった時間を合計すると、39.73,7.32秒 となります。加減乗除算セットの時間が、それぞれ 27.28,5.64秒なので、どちらも速くなっ ています。これは、For ループそのものにかかる時間分(3回のループ)、速く なっていると考えられます。
 また、1回のFor ループ処理そのものにかかる時間は、

Visual Basic (39.73-27.27) / 3 = 4.18秒
Visual C++ (7.32-5.64) / 3 = 0.56秒
、と推算できます。

 このループ処理時間を差し引いた計算そのもの時間は、次の表のようになります。

言語加算減算乗算除算加減乗除算ループ処理
VB4.984.985.987.2323.104.18
VC0.220.230.773.865.080.56
*単位は秒

 この推算は、実に興味深いと思います。加減算では20倍以上の処理能力の違いが あるのに対し、乗算では8倍程度となり、除算に至っては2倍以下です。
 このことは、Visual Basicの除算が高速でVisual C++が低速というより、 計測に利用したCPUの演算処理が、除算に弱いことを示しています。 つまり、この実験の環境において除算を多用するようなプログラムでは、 Visual BasicとVisual C++の処理能力差は気にするほどではないということになります。
 しかし、どちらにしてもVisual Basicの計算能力が劣ってることは確かで あり、これを補うには、計算部分だけVisual C++プログラムに任せる (Visual C++で.dllファイルをつくり、 Visual BasicからWINAPIとして呼び出す)方法があります。


(注意)  今回の計測は、整数型に限ったもので、浮動小数点型ではどういった結果が 分かりません。また、Visual BasicとVisual C++のバージョンが違うので、正確な比較はでき ません。