• 締切済み

関数呼び出しに時間がかかる

VB.NETに関してご質問があります。 下記ソースで、OKボタをクリックしたときにcmdOK_Click()関数が実行されます。 TimeLogは現在時刻をログに出力する関数です。 cmdOK_Click()内でTest()関数をコールしていますが、(1)と(2)の時間差が約3~4秒となります。 しかし、Test()関数内の「Dim rs As ADODB.Recordset = Nothing」を削除すると、(1)と(2)の時間差はほぼなくなります。 「Dim rs As ADODB.Recordset = Nothing」が関数内に記載されているだけで、時間が3,4秒もかかる原因は何でしょうか? <ソース例> 'OKボタンクリック時のイベント Private Sub cmdOK_Click(省略)  clsCommon.TimeLog("cmdOK_Click Start") '(1)現在時刻をログに出力  Test() End Sub Private Sub Test()  clsCommon.TimeLog("Test Strat") '(2)現在時刻をログに出力  Dim rs As ADODB.Recordset = Nothing End Sub

みんなの回答

noname#251971
noname#251971
回答No.2

補足コメントの前半に書かれている点がそもそも本来の疑問点のように見えます。 (後から重要な情報を出してくる質問方法は回答者側としては正直なところ、いやなやり方だなぁと感じます) もしかするとほかに詳しい方がいるかもしれませんので、そういった情報を(あとOSやプログラムのbit数なども)記載した上で改めて質問をしてみてはいかがでしょうか? 後半部分もまた違った内容の話かと思いますので、そちらもまた別途質問を出してみてはいかがでしょうか。 別に、気分を害したから答えたくないとかではないですよ。 当方は元の質問文に記載された内容に関しては知っている情報を回答しましたが、補足コメントにあるような点については単純に知りません。

noname#251971
noname#251971
回答No.1

VB.NETに限らず、.NETのプログラムはIL(中間言語)をJIT(Just-in-time)コンパイルしながら実行します。 メソッドごとにJITが行われますが、その際にプログラムの実行を開始してから初めて利用する型があると、その型の情報をそこでロードします。 例えば参照しているDLLの中に定義されている型であればそこで初めてDLLを読み込みますし、質問文のようにCOMオブジェクトならそこでレジストリなどから型情報を読み込んだりすると思います。 たぶん、その時間のかかる呼び出しは最初の1回だけではないですか? また、これは質問内容とはズレますが、.NETのプログラムからデータベースを利用するのであれば、通常はADOではなくADO.NETを利用します。 どうしてもADOにしかない機能が必要であれば仕方がないですが、それだとCOM経由になりオーバーヘッドは大きくなるので、ADO.NETを利用するよりもかなり遅くなると思います。

guutaranyanko
質問者

補足

toras9000 様、ご回答ありがとうございます。 ご指摘の通り時間がかかるのは最初の1回だけです。 現在、あるシステムのサーバ更改を行っており、現行はWin2008、次期は2012R2です。 実は時間がかかるのは次期のみで、現行では(1)から(2)まで1秒もかかりません。 原因はご指摘の通りだとして、なぜ次期だけ時間がかかるのでしょうか? 対応策は何かないでしょうか? >.NETのプログラムからデータベースを利用するのであれば、通常はADOではなくADO.NETを利用します。 サーバ更改のみを行っており、可能ならばプログラムの修正は行いたくないのです。 ADOからADO.NETへの変更だけでも、テスト工数が膨大になります。 プログラムの修正を行うことなく、何かOSの設定(?)などで対応する方法ないでしょうか??