- PR -

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

投稿者投稿内容
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2004-02-17 22:18
 保守できないものに手を出すべきではないと思います。

 仮にきちんとビルドが通ったとして、その後計算結果がおかしいということがわかりました。検証すると、VB.NETで作ったコードには問題がないことがわかりました。どうもC++の部分でバグがあるようです。さて、どうしますか?

 自分たちで保守ができないもの、保守を期待できないものには手を出すべきではありません。

#iStationさんのコードにバグがあるといっているのでありません
#念のため
iStation
大ベテラン
会議室デビュー日: 2003/12/08
投稿数: 158
投稿日時: 2004-02-17 22:27
引用:

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


DllImport属性で実行時に呼び出しますので、参照設定は不要です。
くまのぷーさん
常連さん
会議室デビュー日: 2003/12/18
投稿数: 34
投稿日時: 2004-02-17 22:50
引用:

Jittaさんの書き込み (2004-02-17 22:18) より:
 保守できないものに手を出すべきではないと思います。

 仮にきちんとビルドが通ったとして、その後計算結果がおかしいということがわかりました。検証すると、VB.NETで作ったコードには問題がないことがわかりました。どうもC++の部分でバグがあるようです。さて、どうしますか?

 自分たちで保守ができないもの、保守を期待できないものには手を出すべきではありません。



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 ]
iStation
大ベテラン
会議室デビュー日: 2003/12/08
投稿数: 158
投稿日時: 2004-02-17 23:21
引用:

くまのぷーさんさんの書き込み (2004-02-17 22:50) より:
...
「'System.DllNotFoundException' のハンドルされていない例外が MegALFA.exe で発生しました。追加情報 : DLL (Matrix.DLL) を読み込めません。」
というエラーが出てしまいました。やはりMatrix.DLLに問題があるのでしょうか。
...


Matrix.dllを実行コードの有るフォルダにコピーしてください。
VB.NETですとプロジェクトフォルダのbinの中です。
くまのぷーさん
常連さん
会議室デビュー日: 2003/12/18
投稿数: 34
投稿日時: 2004-02-18 00:11
引用:

iStationさんの書き込み (2004-02-17 23:21) より:

Matrix.dllを実行コードの有るフォルダにコピーしてください。
VB.NETですとプロジェクトフォルダのbinの中です。



動きました!iStationさん、長々とありがとうございました。
ところで、これを参考にコードを書き直してTestしてみようと思いますが、

<DllImport("Matrix.DLL", EntryPoint:="_CalcMatrix@20")> _
<DllImport("Matrix.DLL", EntryPoint:="_ClearMatrix@12")> _

の中の@20、@12に意味を教えていただけますか?任意の数字というわけではないですよね。
Jubei
ぬし
会議室デビュー日: 2002/03/02
投稿数: 830
お住まい・勤務地: 関西
投稿日時: 2004-02-18 07:05
諸農です。

引用:

の中の@20、@12に意味を教えていただけますか?任意の数字というわけではないですよね。



関数名が変形しているのでしょう。

「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 ]
iStation
大ベテラン
会議室デビュー日: 2003/12/08
投稿数: 158
投稿日時: 2004-02-18 09:40
引用:

くまのぷーさんさんの書き込み (2004-02-18 00:11) より:
...
の中の@20、@12に意味を教えていただけますか?任意の数字というわけではないですよね。
...


引数のバイト長です。C++の名前修飾によるものです。
構成プロパティ>リンカ>デバッグ>マップファイルの作成を「はい」
にするとコンパイラがマップファイルを吐き出してくれます。
その中に関数の内部名がありますので参照してください。
はにまる
ぬし
会議室デビュー日: 2003/12/19
投稿数: 969
お住まい・勤務地: 誤字脱字の国
投稿日時: 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 は対象オブジェクトよりリストを
  取得する為。

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