質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
.NET Framework 3.5

.NET Framework-3.5は、NET Framework 2.0にアセンブリを追加(3.0も含む)したものをベースにしています。

VB.NET

Microsoft Visual Basic .NETのことで、Microsoft Visual Basic(VB6)の後継。 .NET環境向けのプログラムを開発することができます。 現在のVB.NETでは、.NET Frameworkを利用して開発を行うことが可能です。

Q&A

解決済

2回答

1855閲覧

System.ni.dllとは何ですか?これにより処理速度が低速になってしまいます。

yokatone

総合スコア43

.NET Framework 3.5

.NET Framework-3.5は、NET Framework 2.0にアセンブリを追加(3.0も含む)したものをベースにしています。

VB.NET

Microsoft Visual Basic .NETのことで、Microsoft Visual Basic(VB6)の後継。 .NET環境向けのプログラムを開発することができます。 現在のVB.NETでは、.NET Frameworkを利用して開発を行うことが可能です。

0グッド

0クリップ

投稿2019/07/10 04:58

前提・実現したいこと

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を引数にしていることが原因と考えて、引数の型を実際的な値に変更したりしましたが、
効果はありませんでした。

ビルドが原因かと思ってReleasex86など、様々なパターンを試しましたが、効果はありませんでした。

生成されるバイナリをngen installしましたが、効果はありませんでした。

ngen update /forceしましたが、指定されたファイルが見つかりません。エラーで実行できませんでした。

補足情報(FW/ツールのバージョンなど)

VS2015
.NET 3.5
Win10

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

結局、ConvertFunctionではなく、その中で行うAnotherOriginalFunction内のRegEx.Match処理がSystem.ni.dllを誘発する原因でした。

VS ProfilerではConvertFunctionが全体処理のうち50%,
System.ni.dllがそのほとんど全てを占めており、
AnotherOriginalFunctionが全体処理のうち4%,

というような表示だったので、すっかり騙されてしまいました。
AnotherOriginalFunctionを試しにReturnのみにしみると、System.ni.dllが消えました。

ご回答ありがとうございました。

投稿2019/07/12 00:48

yokatone

総合スコア43

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

こちらの事象ではないでしょうか。

.NET Framework のネイティブ イメージが無効になる状況と考えられる影響について

現象
Windows Update や .NET Framework の更新プログラムの適用後、.NET Framework を使用するアプリケーションやサービスの動作が遅くなる場合や、CPU 使用率が高騰する場合があります。

対処方法もリンク先に記載されているので試してみてください。

投稿2019/07/10 08:06

S_kawa

総合スコア156

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問