Q&A
前提・実現したいこと
System.ni.dllが動作する原因を知りたい。
可能であれば処理から取り除けるようにしたい。
該当のソースコード
vb:ConvertFunction
1Function ConvertFunction(ByVal data As Object) As DateTime 2 Try 3 Dim dts As String = CStr(data) 4 dts = AnotherOriginalFunction(dts) 5 Dim ret As DateTime = DateTime.Parse(dts) 6 7 Return ret 8 Catch ex As Exception 9 Throw new System.FormatException("型エラー") 10 End Try 11 12End Function
発生している問題・エラーメッセージ
現在ある処理がとても低速で、Visual Studio Performance Profilerを使って
処理のパフォーマンスを計測しました。
すると、処理中の特定の関数(以下ConvertFunction
)でSystem.ni.dll
という呼び出しに
全体の半分ほどの時間を要していることが分かりました。
この処理は標準のCDate
とほぼ同じ動きをしているので、
ConvertFunction
を呼び出す関数をCDate
に置き換えてみると、System.ni.dll
が呼び出されなくなり、処理が高速化しました。
しかし、であれば次のコードも同じ結果になると思い、プロファイルしましたが、System.ni.dll
が呼び出されて、処理時間は元の遅い状態と変わらないものでした。
vb
1Function ConvertFunction(ByVal data As Object) As DateTime 2 Return CDate(data) 3End Function
なぜSystem.ni.dll
が呼び出されて、呼び出されるのか、
また、呼び出されるだけならまだしも、特に何も行っていないはずの処理に長時間かかってしまうのか。。
心当たりのある方がおられたら教えてください。
試したこと
System.ni.dll
のpdb出力を行おうとましたが、
Failed to find dependencies of image createpdb because of the following error: 指定されたファイルが見つかりません。 (Exception from HRESULT: 0x80070002)
によって出力ができませんでした。
また、この関数は小さいので、処理全てを別関数として切り出し、
処理にかかっている部分を探ろうとしましたが、
ConvertFunciton
には呼び出し以外の具体的な処理が存在しないにも関わらず、
結局ConvertFunction
の処理時間のほとんどがSystem.ni.dll
の呼び出しとなっていました。
Tryを無効にしても特に効果はありませんでした。
Objectを引数にしていることが原因と考えて、引数の型を実際的な値に変更したりしましたが、
効果はありませんでした。
ビルドが原因かと思ってRelease
やx86
など、様々なパターンを試しましたが、効果はありませんでした。
生成されるバイナリをngen install
しましたが、効果はありませんでした。
ngen update /force
しましたが、指定されたファイルが見つかりません。
エラーで実行できませんでした。
補足情報(FW/ツールのバージョンなど)
VS2015
.NET 3.5
Win10
回答2件
下記のような回答は推奨されていません。
このような回答には修正を依頼しましょう。