- - PR -
VB.VETで、処理速度を早くしたいのですが
投稿者 | 投稿内容 | ||||||||
---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2004-02-18 10:41
【サブスレッド】iStationさん指定のC/C++作成のDllを使うと早くなる理由
マネージドコード(VB.NET,C#.NET,C++.NET(マネージド))よりアンマネージドコード(C++(Win32))が早い理由は、ネイティブかそうでないかの違いです。 ちなみに、別件の1は違います。 変数にアクセスするのは直接だが、 ADOオブジェクト と Excelオブジェクトにアクセスするのは間接だ。 ってことです。 例をあげると、 変数にアクセスするのは、開発会社とエンドユーザが直接仕事するようなもの。 Excelオブジェクトにアクセスするのは、開発会社とエンドユーザの間に2次受け、3次受けがいるようなもの。 です。 ああ、もともとの質問も上の例で説明できるなぁ。 変数をC++(Win32)に置き換えて、 Excelオブジェクトをマネージコードに置き換えてもらえるといいと思います。 #ちなみに、例に他意はありません。 | ||||||||
|
投稿日時: 2004-02-18 10:46
バグってるとおっしゃっている理由が、 「配列aが値型の配列だから、このコードは無効では?」という意味なら その通りだと思います。 --追記ここから--- 値型に限らず、参照型の場合でも列挙された各値を表す変数(この場合i)に 別のオブジェクト参照を代入するのは無意味ですね。 プロパティやメソッドを介して何かしないと。 --追記ここまで--- 下記で試せますが、Integerなどは値型のため、 a(x)の形で直接値を変更しなければ、a(x)の値は変更されません。 ※xは添え字とします。 ' (ソースコード) Dim a() As Integer = {1, 2, 3} For Each i As Integer In a ' (注)For文でのi As Integerは.NET Framework1.1からの構文です ' 変数iにはa(x)の値のコピーがセットされる。 ' 変数iはa(x)とは無関係のためiに10を設定してもa(x)には影響しない i = 10 Next Debug.WriteLine(a(0)) Debug.WriteLine(a(1)) Debug.WriteLine(a(2)) ' (結果) ' 1 ' 2 ' 3 [ メッセージ編集済み 編集者: よねKEN 編集日時 2004-02-18 11:03 ] | ||||||||
|
投稿日時: 2004-02-18 10:48
【サブスレッド】iStationさん指定のC/C++作成のDllを使うと早くなる理由
VBのEXEは、EXEといっても確か中間コードのようなものですよね? VBランタイムがネイティブコードに変換して実行する形だった気がします。 ※ウソだったらすみません^^; で、次期ウィンドウズのLonghornではWinFXとかいうのが実装されるようですが、 従来のWin32APIを使用するより、WinFXを利用した方が速いそうです。 現状とはイメージ的には逆になってしまいますね^^; [ メッセージ編集済み 編集者: りばぁ 編集日時 2004-02-18 10:49 ] [ メッセージ編集済み 編集者: りばぁ 編集日時 2004-02-18 10:51 ] | ||||||||
|
投稿日時: 2004-02-18 10:56
VB4までは中間コード(P-CODE)でしたが、VB5、6では、 コンパイル時に中間コードとしてコンパイルするか、 ネイティブコードにコンパイルするかを選べるようになっています。 ・中間コードの場合、ランタイムありきで、 ランタイムで中間コードが解釈され実行されます。 ・ネイティブコードの場合、まずランタイムが起動し、 その後、ネイティブコードに処理を移します。その中でVBの関数を使っている場合、 ネイティブコードからランタイムの関数が呼ばれます。 というような感じのはずです。 | ||||||||
|
投稿日時: 2004-02-18 11:37
追記されているように、何も行われないからです。 これは想定されていた動作ではないはずです。 ということでした。 --編集 引用失敗修正 [ メッセージ編集済み 編集者: なちゃ 編集日時 2004-02-18 11:52 ] | ||||||||
|
投稿日時: 2004-02-18 11:51
私の経験では、VB4.0の時代にVBの容易なUI開発環境からCで書かれた行列関連 の科学計算ライブラリを利用したいという理由でこの方法を取ったのですが、 えらく速度が向上した印象でした。たぶん、コンパイラの最適化のレベルの 違いから来るものと思います。将来は、CLRの最適化のレベルが向上すると 思いますので、時々比較をしたいと思っています。 | ||||||||
|
投稿日時: 2004-02-18 11:54
【サブスレッド】iStationさん指定のC/C++作成のDllを使うと早くなる理由
NAL-6295 さんへ ご返答とご指摘ありがとうございます。 .Net 言語の内部処理は全言語、一緒になると勘違いしていました。 勉強になります。 皆様へ 追加質問です。調査し切れなかったのですが、 VB.Netの実行モジュールは、「マネージド」コードがデフォルトと 記述されていました。 初心者の考えですが、VBのコンパイルを「アンマネージド」指定で行い ネイティブコードに変換すれば、DLL対策と一緒の利点を得れると考えました。 やはり、「アンマネージド」にすると注意点(制御する事)が増える為、 今回の様に一部(DLL)を「アンマネージド」にして外出しにし、 元の処理(VB .Net)は「マネージド」がベストなのでしょうか? # 話が深くなりそうならば、別スレッドにします。 | ||||||||
|
投稿日時: 2004-02-18 11:58
NAL-6295です。 ん? そもそも、.NET開発環境でアンマネージドな、つまりWin32な開発ができるのは、 C++だけです。 VB.NETもC#.NETもコンパイル後はMSILが生成されるだけです。 |