• ベストアンサー

VBでVC++の処理速さを実現する

tsukasa-12rの回答

回答No.8

ちょっと遅くなりました。 結論を先に言うと、私としては予想以上に差が出たという気がします。 要素数 10000 の 32 bit 整数配列のソート(クイックソート)を 1000 回繰り返したときの所要時間は VC++ : 3 sec VB : 61 sec でした。( Pentium (3) 730MHz + Memory 384MB + WindowsXP ) ちなみにソースは === C === #include <stdio.h> #include <stdlib.h> #include <time.h> void qsort( int *piData, int iStart, int iEnd ); int main( int iArgc, char *pstrArgv[] ) {   if( iArgc < 2 ) {     printf( "Usage : QuickSort FileName NumberOfData" );     return( -1 );   }   FILE *fp = fopen( pstrArgv[1], "r" );   if( NULL == fp ) {     printf( "%s が見つかりません.\n", pstrArgv[1] );     return( -1 );   }   int iNumberOfData;   int *piData;   int *piWork;   char strBuffer[100];   char *p;   int i;   time_t tStart;   time_t tEnd;   int iRepeat;   iNumberOfData = atoi( pstrArgv[2] );   iRepeat = atoi( pstrArgv[3] );   piData = new int[iNumberOfData];   i = 0;   do {     p = fgets( strBuffer, 100, fp );     if( NULL != p ) {       piData[ i ] = atoi( strBuffer );       i++;       if( iNumberOfData <= i ) {         break;       }     }   } while ( *p );   fclose( fp );   piWork = new int[iNumberOfData];   tStart = time(NULL);   for( i = 0; i < iRepeat; i++ ) {     for( int j = 0; j < iNumberOfData; j++ ) {       piWork[ j ] = piData[ j ];     }     qsort( piWork, 0, iNumberOfData - 1 );   }   tEnd = time(NULL);   printf( "%d [s]\n", tEnd - tStart );   fp = fopen( pstrArgv[3], "w" );   if( NULL == fp ) {     return( -1 );   }   for( i = 0; i < iNumberOfData; i++ ) {     fprintf( fp, "%6d\n", piWork[ i ] );   }   fclose( fp );   return( 0 ); } void qsort( int *piData, int iStart, int iEnd ) {   int iForward;   int iBackward;   int iTemp;   if( iEnd <= iStart ) {     return;   }   iForward = iStart + 1;   iBackward = iEnd;   while( iForward <= iBackward ) {     while( iForward <= iBackward ) {       if( piData[ iStart ] < piData[ iForward ] ) {         break;       }       iForward++;     }     while( iForward <= iBackward ) {       if( piData[ iBackward ] < piData[ iStart ] ) {         break;       }       iBackward--;     }     if( iBackward <= iForward ) {       break;     }     iTemp = piData[ iBackward ];     piData[ iBackward ] = piData[ iForward ];     piData[ iForward ] = iTemp;     iForward++;     iBackward--;   }   iTemp = piData[ iBackward ];   piData[ iBackward ] = piData[ iStart ];   piData[ iStart ] = iTemp;   qsort( piData, iStart, iBackward - 1 );   qsort( piData, iBackward + 1, iEnd ); } === VB === Private Sub Command1_Click()   Dim iFileNo As Integer   Dim lngData() As Long   Dim lngWork() As Long   Dim dtStart As Date   Dim dtEnd As Date   Dim i As Integer   Dim iNumberOfData As Long   Dim iRepeat As Integer   Dim strCommand() As String   strCommand = Split(Command(), ",")   iNumberOfData = CInt(strCommand(0))   iRepeat = CInt(strCommand(2))   iFileNo = FreeFile   Open strCommand(1) For Input Access Read As #iFileNo   ReDim lngData(iNumberOfData)   For i = 0 To iNumberOfData - 1     Input #iFileNo, lngData(i)   Next i   Close #iFileNo   dtStart = Now   For i = 1 To iRepeat     lngWork = lngData     QuickSort lngWork, 0, 9999   Next i   dtEnd = Now   MsgBox DateDiff("s", dtStart, dtEnd), vbInformation End Sub Private Sub QuickSort(ByRef strData() As String, ByVal lngStartIndex As Long, ByVal lngEndIndex As Long)   Dim strWork As String   Dim i As Long   Dim j As Long   If lngStartIndex >= lngEndIndex Then Exit Sub   i = lngStartIndex + 1   j = lngEndIndex   Do While i <= j     Do While i <= j       If strData(i) > strData(lngStartIndex) Then         Exit Do       End If       i = i + 1     Loop     Do While i <= j       If strData(j) < strData(lngStartIndex) Then         Exit Do       End If       j = j - 1     Loop     If i >= j Then Exit Do     strWork = strData(j)     strData(j) = strData(i)     strData(i) = strWork     i = i + 1     j = j - 1   Loop   strWork = strData(j)   strData(j) = strData(lngStartIndex)   strData(lngStartIndex) = strWork   Call QuickSort(strData, lngStartIndex, j - 1)   Call QuickSort(strData, j + 1, lngEndIndex) End Sub という感じです。

VitaminBB
質問者

お礼

回答ありがとうございます。 凄い差ですね。

関連するQ&A

  • VB6, VB2005,VC# どれを学習したらよいでしょうか。

    VB6, VB2005,VC# どれを学習したらよいでしょうか。 やりたいことはデータベースやテキストファイル処理、インターネットコネクションのプログラミングです。 仕事でExcelVBAを時々使うので、以前から持っているVB6かと思ったのですが、なぜかMSDNがなくリファレンスがなく微妙です。本かウェブしか頼れない・・・。 ある程度の処理速度を求めていますのでExcelVBAではない方がいいのですが、これからのことを考えたらVB6よりもVB2005でしょうか? それともどうせVB2005はexcelとは大幅に文法が変わってしまうのだからC#? いろいろ調べるほどわからなくなってしまいました。 なおエクセルVBAも本に一通り書いてあることも満足にできない程度です・・・。(こちらにも役立てられるとさらにうれしいです)

  • VC++とVC#について

    VC#が出て久しいですよね。 MSが推奨する言語なのでそちらに移行するものと思っていましたが、処理速度が遅くなるという欠点があるそうですね。 プロの現場ではVC#へ移行しつつあるのでしょうか? それともまだまだVC++のほうが根強い人気なのでしょうか? いろいろなご意見お待ちしてます。

  • C言語やC++、VC++について

    C言語やC++、VC++について C言語やC++、VC++などはIL コードと呼ばれる中間言語が作成されるのでしょうか?それともコンパイラーがネイティブコードに変換されるのでしょうか?でもネイティブコードに変換すると機械語なので互換性がないのではないのでしょうか?それなのになぜ他のwindowsのパソコンで実行できるのはなぜなのでしょうか?そこら辺はどうなっているのでしょうか?

  • .NET C++の処理速度

    最近.NETについて調べていました。 .NETではコンパイル時にマネージドコードと呼ばれる中間ファイルが作成され、 それが.NETFramework上で動くという仕組みのため、C++で書こうがVBで書こうが 最終的にできあがるものは同じものになるということが分かりました。 私は、Cが有利な点は(Javaなど他の言語に比べ)処理速度が異常に早いことだと思っていましたが .NET上で動く場合はC++もVBも処理速度に差が出ることはあまりないのでしょうか? また、.NET、JVM、ネイティブのCの3つを比較した場合、 どのくらい処理速度に差があるでしょうか?(大雑把でもいいので) 私は [ネイティブC] >>>超えられない壁>>> [.NET] > [JVM] くらいかと思っているのですが‥ 以上、よろしくお願いします。

  • 混ぜちゃダメなんですか?

    プログラミングについて疑問があります。 最終的に機械語に変換されるなら、javaとRubyとかPHP、他の言語を混ぜたプログラムは作れるんですか? そういうの、やった人とかいるのでしょうか?  (言語って沢山あるんだ~、コンパイラって何?という超初心者レベルです。  お返事は素人が理解しやすいように書いて頂けたら嬉しいです。  よろしくお願いします。)

  • シェルとカーネルの概念とプログラムの処理の流れ

    興味本位で「プログラミング」について、調べ学んでる内にひとつの壁にぶつかりましたので質問させていただきます。 質問内容は「シェルとカーネル。そしてアプリケーション」になります。 素人ながら現在持っている論理を下記に列挙します。誤認識などあれば指摘いただければ幸いであります。 狭義での論争は、避けたいので、広義として理解頂ければと思います。(狭義や曖昧な点においてもある程度学習済み) 1. プログラミング言語には、低級・高級言語があり、ハードよりのC言語(影響下のC++, Objective-C)で作られたプログラムの実行速度は速い。 2. プログラム処理系には、インタプリタ・コンパイラがあり、一般ユーザーが使用するアプリケーションのほとんど(.exeなど)がコンパイラアプリケーション。 3. JavaなどVM環境下動作するアプリケーションは、中間言語で実行される。 4. OSには中核であるカーネルがあり、カーネルは人工言語(コンピューター言語)を機械語に訳し、各リソース(CPU・RAMなど)に処理を実行させる。 5. カーネルはシェルに覆われており、実際のユーザー側の処理のリクエストは、シェルを介して行われる。 6. シェルには大別して、CLI(CUI)とGUIがあり、CLIシェルはプロンプトが表示されるコマンドラインインタプリタ。 7. GUIシェルは、OSがオペレーションの意から、OSの各種機能(Windows System, エクスプローラー等)。※ 私は理解を容易する為にOSそのものをシェルと捉えてます。 長くなりましたが、上記を踏まえた上での質問が下記になります。 Q. iTunes, Word, などの各種アプリケーションの各種操作(処理、実行)というのは、コンピューター言語でシェルを介し機械語でカーネルまで橋渡しされるのでしょうか? なぜこのような質問になるかといいますと... プログラミング言語は機械語にコンパイルして、はじめてコンピューターに理解してもらえる事は百も承知です。 プログラミング言語で制作されたアプリケーションの処理や実行は当然、コンパイル済みの機械語で行うものと認識しております。(ここでは中間言語は除く) ここで冒頭に述べた壁に当たりました。洒落ではなく、私の中で「殻」もとい「壁化」してしまったシェルの存在です。 現在、持ち合わせてる論理から考察すると、機械語で実行された処理をシェルを介す意味がどこにあるのか?それとも介さずカーネルにそのまま引き渡してるのか? 私が間違っており、そもそも制作されたアプリケーションの処理や実行は、コンピューター言語であり、それをシェルを介しカーネルという流れがあるのならば、コンパイラの存在意義が分かりません。 本来はもっと自分が思ってる事を言語化出来ればいいのですが、これが現時点で精一杯です。

  • .NET frameworkについて

    .NET frameworkとはJVMとほとんど同じような気がするのですが、いろんな言語が使えること以外に何かメリットあるのでしょうか? それと、たとえば、VC.NETで作ったプログラムはコンパイラで中間コードになって、実行時に.NET frameworkでインタプリタみたいに機械語に直して実行しているのでしょうか?

  • Cで作成したDLLをVBで呼出

    Cで作成したDLLの関数をVB6.0から呼び出す事ができず、悩んでおります。 ご教授お願いします。 どの様な関数を呼び出そうとしているのかというと、以下の通りです。 <DLL Cで作成(コンパイラVC6)> void WINAPI hoge(BSTR pgname,BSTR fmt,...){ ~処理~ } /* 宣言では頭にDLLExport*/ <呼出側 VB6.0で作成> '宣言 Public Declare Function hoge Lib "hoge" _ (ByRef pgname as String , _ ByRef fmt as String , _ ParamArray args()) '呼出 call hoge("foo","baa","array1",2) この様なコードを書いております。 C側、VB側ともに固定数の引数にしてみたところ、 通ったので「ParamArray args()」の定義が違うのではないか・・・?と思っているのですが、 どの様に宣言したらよい物なのでしょうか? もしくは、そもそも全然違う箇所を間違っているのでしょうか? 宜しくお願いします。 ※ 説明の足りない箇所があれば、仰ってください。

  • 各言語の特徴

    いろんな言語の特徴が知りたいです。 C:処理速度がはやい VB:開発効率がいい VC++:ネットワークに強い JAVA:ネットワークに強い? Delphi: COBOL: 他たくさん知りたいですσ(^^) 教えてください、お願いします(^^)

  • VBでフォントデータを得る方法

    PC上で動作する言語としてはVBだけが少々わかる程度です。 このVBだけを頼りに、文字のフォントデータを取得したいと考えています。 フォントとしては16x16で、フリーで装飾的要素のない一般的なものが希望です。 このデータによりLEDマトリクスに文字を再生したいのです。 用途としては商用です。 文字のシフトJISコードを得ることまではできました。 このコードによりフォントデータを得るためには、そのファイルそのものが VBで扱えるようになっていなければならないわけですが これが見当たりません。 ・・・というか、ここで以前フリーのフォントを教えていただいたのですが インストールさえできませんでした。 (なぜできないかを説明するのも、わからない用語が多すぎてできません) VBだけで処理できる都合のよいファイルがありましたら教えてください。 それともVBの初歩レベルだけでは無理でしょうか?