- - PR -
VB.VETで、処理速度を早くしたいのですが
投稿者 | 投稿内容 | ||||
---|---|---|---|---|---|
|
投稿日時: 2004-02-17 18:24
たしかに逆ですね。
forのほうがはやいはずです。 書籍等で言及しているものがあったはず。 #どの本だったっけかな | ||||
|
投稿日時: 2004-02-17 19:40
VB6.0以前はwithを使うとオブジェクトの解決をしないから速くなると聞いたことがあるのですが、.NETはどうなのかな?
#訂正 解決をしないから→解決を先に済ますから [ メッセージ編集済み 編集者: Jitta 編集日時 2004-02-17 19:41 ] | ||||
|
投稿日時: 2004-02-17 19:56
皆さん、いろいろなご指摘ありがとうございます。
今はiStationさんに教えていただいた、C++のDLLに奮闘中なので、タイムリーに回答できず申し訳ありません。 で肝心のC++のDLL化なのですが、初めてづくしで、なかなかうまくいかないので、基本的な操作を教えていただけますでしょうか。 まず、C++でWin32プロジェクトを選んでアプリケーションの設定でDLLの選択をすると、 // matrix.cpp : DLL アプリケーションのエントリ ポイントを定義します。 // #include "stdafx.h" BOOL APIENTRY DllMain( HANDLE hModule, DWORD ul_reason_for_call, LPVOID lpReserved ) { return TRUE; } というのが自動生成されます。 iStationさんの下記のコードをこれに上書きすると、コンパイルでエラーになります。 で、自動生成されたコードの下に続けて記述すると、コンパイルはされるのですが、Releaseフォルダーのmatrix.dllをVB.NETのほうで参照設定しようとしても、出来ません。 何かトンチンカンなことをやっているのでしょうか。 // Matrix.cpp #include <stdio.h> extern "C" _declspec(dllexport) int _stdcall CalcMatrix(double* A, double* B, double* C, long imax, long jmax); extern "C" _declspec(dllexport) int _stdcall ClearMatrix(double* A, long imax, long jmax); extern "C" _declspec(dllexport) int _stdcall CalcMatrix(double* A, double* B, double* C, long imax, long jmax) { int i,j; for (i=0;i<=imax;i++){ for (j=0;j<=jmax;j++){ A[i+j*(imax+1)] = A[i+j*(imax+1)] + B[i+j*(imax+1)] + C[i+j*(imax+1)]; } } return -1; } extern "C" _declspec(dllexport) int _stdcall ClearMatrix(double* A, long imax, long jmax) { int i,j; for (i=0;i<=imax;i++){ for (j=0;j<=jmax;j++){ A[i+j*(imax+1)] = 0.0; } } return -1; } | ||||
|
投稿日時: 2004-02-17 20:09
以前実験したんですが、
ただ単にループのみならforの方が速いですが、 for i = 0 to a.lengrh -1 a(i) = 10 next の様にFor内部で代入演算を行う場合 for each i in a i = 10 next の方が速かったと。 あれ?記憶違いかな・・・・ | ||||
|
投稿日時: 2004-02-17 20:26
本題と直接関係ないところで引っ張ってすみません。m(_ _)m
このプログラムはバグっているように見えたりするのは気のせいですか? [ メッセージ編集済み 編集者: なちゃ 編集日時 2004-02-17 20:41 ] | ||||
|
投稿日時: 2004-02-17 21:14
meiです。
http://www.microsoft.com/japan/msdn/net/general/dotnetperftips.asp ↑MSDNの資料によると、例えば文字列をループさせた場合には、 foreachの方が5倍ほど遅いそうです。 | ||||
|
投稿日時: 2004-02-17 21:22
#include "stdafx.h"は残してください。DllMainは上書きしても良いです。 Releaseフォルダーのmatrix.dllをVB.NETの実行コードのあるフォルダに コピーしてください。これで、VB.NETから呼び出せるはずです。 アンマネージドなコードなので、DLL側で配列の領域を超えてデータを 書き換えしないよう留意ください。 | ||||
|
投稿日時: 2004-02-17 21:58
やはり、VB.Net側で、参照の追加で、Matrix.dllをコンポーネントとして追加しようとすると、「ファイルがアクセス可能で、有効なアセンブリまたはCOMコンポーネントであることを確認してください」としかられてしまいます。Matrix.dllを作成する段階で、何か不手際があるのでしょうか。 |