- - PR -
VB.VETで、処理速度を早くしたいのですが
投稿者 | 投稿内容 | ||||
---|---|---|---|---|---|
|
投稿日時: 2004-02-17 22:18
保守できないものに手を出すべきではないと思います。
仮にきちんとビルドが通ったとして、その後計算結果がおかしいということがわかりました。検証すると、VB.NETで作ったコードには問題がないことがわかりました。どうもC++の部分でバグがあるようです。さて、どうしますか? 自分たちで保守ができないもの、保守を期待できないものには手を出すべきではありません。 #iStationさんのコードにバグがあるといっているのでありません #念のため | ||||
|
投稿日時: 2004-02-17 22:27
DllImport属性で実行時に呼び出しますので、参照設定は不要です。 | ||||
|
投稿日時: 2004-02-17 22:50
Jittaさんのご意見はもっともだと思います。ただ、iStationさんのC++のコードは非常にシンプルで、自分でもこのコードなら保守可能と判断しましたので、もう少しこの線でがんばってみようと思います。 実は、以前まだオブジェクト指向もよく理解できていないころ、JittaさんやFoxさんにリフレクション等の助言を頂き(その節はありがとうございました)、オブジェクト指向への理解がスムーズに進んだ経験があります。自分がやりたいことに対しての解決策はどんな参考書にも勝るのだと実感したしだいです。 で、問題のC++のdllの利用なのですが、参照設定をせず、iStationさんの以下の コードを試しに実行しようとしたところ、Matrix.ClearMatrix(A(0, 0), 99, 99)のところで、 「'System.DllNotFoundException' のハンドルされていない例外が aaa.exe で発生しました。追加情報 : DLL (Matrix.DLL) を読み込めません。」 というエラーが出てしまいました。やはりMatrix.DLLに問題があるのでしょうか。 Imports System.Runtime.InteropServices Module Module1 ' Imports System.Runtime.InteropServices Class Matrix <DllImport("Matrix.DLL", EntryPoint:="_CalcMatrix@20")> _ Public Shared Function _ CalcMatrix(ByRef A As Double, ByRef B As Double, ByRef C As Double, ByVal imax As Integer, ByVal jmax As Integer) As Integer End Function <DllImport("Matrix.DLL", EntryPoint:="_ClearMatrix@12")> _ Public Shared Function _ ClearMatrix(ByRef A As Double, ByVal imax As Integer, ByVal jmax As Integer) As Integer End Function End Class Sub main() While True 'To stop: Ctrl+C StartTime = DateTime.Now.ToOADate Matrix.ClearMatrix(A(0, 0), 99, 99) Matrix.ClearMatrix(B(0, 0), 99, 99) Matrix.ClearMatrix(C(0, 0), 99, 99) For k = 0 To 999 i = Matrix.CalcMatrix(A(0, 0), B(0, 0), C(0, 0), 99, 99) Next k EndTime = DateTime.Now.ToOADate SpanCalc = EndTime - StartTime Console.WriteLine("Start:{0}, End:{1}, Span:{2}", StartTime, EndTime, SpanCalc) End While End Sub Dim A(100, 100) As Double Dim B(100, 100) As Double Dim C(100, 100) As Double Dim i, j, k As Integer Dim StartTime As Double Dim EndTime As Double Dim SpanCalc As Double End Module [ メッセージ編集済み 編集者: くまのぷーさん 編集日時 2004-11-08 09:36 ] | ||||
|
投稿日時: 2004-02-17 23:21
Matrix.dllを実行コードの有るフォルダにコピーしてください。 VB.NETですとプロジェクトフォルダのbinの中です。 | ||||
|
投稿日時: 2004-02-18 00:11
動きました!iStationさん、長々とありがとうございました。 ところで、これを参考にコードを書き直してTestしてみようと思いますが、 <DllImport("Matrix.DLL", EntryPoint:="_CalcMatrix@20")> _ <DllImport("Matrix.DLL", EntryPoint:="_ClearMatrix@12")> _ の中の@20、@12に意味を教えていただけますか?任意の数字というわけではないですよね。 | ||||
|
投稿日時: 2004-02-18 07:05
諸農です。
関数名が変形しているのでしょう。 「VBから呼び出し可能なDLL宣言」 http://homepage2.nifty.com/DSS/VCPP/DLL/dllvbcall2.htm 「モジュール定義ファイル(.DEFファイル)を使ってエクスポート」 http://hp.vector.co.jp/authors/VA023539/tips/dll/002.htm で、紹介されているようにDEFファイルを作ればC++側でエクスポートした 関数名が変形しません。 【追加】 このスレッドを読み返しましたが、Jittaさんの 「保守できないものを業務に採用すべきでない」 という意見に賛成です。 _________________ 諸農和岳 Powered by Borland Delphi/C++Builder & Microsoft VS.NET [ メッセージ編集済み 編集者: Jubei 編集日時 2004-02-18 09:59 ] | ||||
|
投稿日時: 2004-02-18 09:40
引数のバイト長です。C++の名前修飾によるものです。 構成プロパティ>リンカ>デバッグ>マップファイルの作成を「はい」 にするとコンパイラがマップファイルを吐き出してくれます。 その中に関数の内部名がありますので参照してください。 | ||||
|
投稿日時: 2004-02-18 10:18
【サブスレッド】iStationさん指定のC/C++作成のDllを使うと早くなる理由
別スレッドを上げ様と思いましたが、↑この形式で行きます。 こちらへの返答は、1行目の文をコピーして下さい。 はにまるです。 興味心からの質問です! なぜ、C/C++ で作成したdll を利用すると早くなるのですか? これは、VB言語よりC言語の方が早いと言う昔からの定説の一例でしょうか? 御教授をお願い致します 別件についは、下記の通りと認識しています。 1.ADOオブジェクト と Excelオブジェクトを直接利用しない理由 オブジェクトが関数+変数のメモリ領域を必要するのに対し 一旦、変数に格納して利用すれば変数だけのメモリ処理になる為。 また、Excelオブジェクトはデカイ 2.for each より for が早い理由 1と一緒で、for each は対象オブジェクトよりリストを 取得する為。 |