- PR -

VB.VETで、処理速度を早くしたいのですが

投稿者投稿内容
小野@どっとねっとふぁん
ぬし
会議室デビュー日: 2001/10/30
投稿数: 402
投稿日時: 2004-02-17 18:24
たしかに逆ですね。
forのほうがはやいはずです。
書籍等で言及しているものがあったはず。

#どの本だったっけかな
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2004-02-17 19:40
 VB6.0以前はwithを使うとオブジェクトの解決をしないから速くなると聞いたことがあるのですが、.NETはどうなのかな?

#訂正
解決をしないから→解決を先に済ますから

[ メッセージ編集済み 編集者: Jitta 編集日時 2004-02-17 19:41 ]
くまのぷーさん
常連さん
会議室デビュー日: 2003/12/18
投稿数: 34
投稿日時: 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;
}
kagura
常連さん
会議室デビュー日: 2003/03/26
投稿数: 27
投稿日時: 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
の方が速かったと。
あれ?記憶違いかな・・・・
なちゃ
ぬし
会議室デビュー日: 2003/06/11
投稿数: 872
投稿日時: 2004-02-17 20:26
本題と直接関係ないところで引っ張ってすみません。m(_ _)m
引用:

kaguraさんの書き込み (2004-02-17 20:09) より:
for each i in a
i = 10
next
の方が速かったと。


このプログラムはバグっているように見えたりするのは気のせいですか?

[ メッセージ編集済み 編集者: なちゃ 編集日時 2004-02-17 20:41 ]
mei
大ベテラン
会議室デビュー日: 2003/04/08
投稿数: 114
投稿日時: 2004-02-17 21:14
meiです。

http://www.microsoft.com/japan/msdn/net/general/dotnetperftips.asp
↑MSDNの資料によると、例えば文字列をループさせた場合には、
foreachの方が5倍ほど遅いそうです。
iStation
大ベテラン
会議室デビュー日: 2003/12/08
投稿数: 158
投稿日時: 2004-02-17 21:22
引用:

くまのぷーさんさんの書き込み (2004-02-17 19:56) より:
iStationさんの下記のコードをこれに上書きすると、コンパイルでエラーになります。
で、自動生成されたコードの下に続けて記述すると、コンパイルはされるのですが、Releaseフォルダーのmatrix.dllをVB.NETのほうで参照設定しようとしても、出来ません。


#include "stdafx.h"は残してください。DllMainは上書きしても良いです。
Releaseフォルダーのmatrix.dllをVB.NETの実行コードのあるフォルダに
コピーしてください。これで、VB.NETから呼び出せるはずです。

アンマネージドなコードなので、DLL側で配列の領域を超えてデータを
書き換えしないよう留意ください。
くまのぷーさん
常連さん
会議室デビュー日: 2003/12/18
投稿数: 34
投稿日時: 2004-02-17 21:58
引用:

iStationさんの書き込み (2004-02-17 21:22) より:
#include "stdafx.h"は残してください。DllMainは上書きしても良いです。
Releaseフォルダーのmatrix.dllをVB.NETの実行コードのあるフォルダに
コピーしてください。これで、VB.NETから呼び出せるはずです。



やはり、VB.Net側で、参照の追加で、Matrix.dllをコンポーネントとして追加しようとすると、「ファイルがアクセス可能で、有効なアセンブリまたはCOMコンポーネントであることを確認してください」としかられてしまいます。Matrix.dllを作成する段階で、何か不手際があるのでしょうか。

スキルアップ/キャリアアップ(JOB@IT)