ASP.NET MVC 4 で StackExchange Miniprofiler を使用しています。現在、割り当てられる値を生成する高価な式を使用して、クラスのメンバー変数への割り当てをプロファイリングしようとしています。Miniprofiler は割り当てステートメントをプロファイリングしたくないようです。エラーを強調するためにコードを単純化しました。
public ActionResult TestProfiling()
{
var profiler = MiniProfiler.Current;
using (profiler.Step("Test 1"))
Thread.Sleep(50);
int sue;
using (profiler.Step("Test 2"))
{
sue = 1;
}
if (sue == 1)
sue = 2;
using (profiler.Step("Test 3"))
{
Thread.Sleep(50);
int bob;
using (profiler.Step("Inner Test"))
{
bob = 1;
}
if (bob == 1)
bob = 2;
}
return View();
}
注: if ステートメントは、単にコンパイラの警告を回避するためのものです。
テスト 1 とテスト 3 は、結果ページの Miniprofiler セクションに表示されます。テスト 2 と内部テストにはありません。ただし、テスト 2 または内部テストの内容をスリープ ステートメントに置き換えると、結果のページに出力されます。
ここで何が起こっているのですか?表示されないテストの1つ内の単純な割り当てステートメントを置き換えても、つまり
using (profiler.Step("Test 2"))
{
ViewModel.ComplexData = MyAmazingService.LongRunningMethodToGenerateComplexData();
}
より複雑なものでは、テスト 2 ステップは、レンダリングされた Miniprofiler セクションにまだ出力を取得しません。Miniprofiler が割り当てステートメントをプロファイリングしないのはなぜですか?
編集: コード例がテキストに対応するようになりました。
Edit2 :さらに掘り下げた後、問題は割り当てステートメントにあるようには見えません。出力結果に何かが表示されるかどうかは、実行にかかる時間に依存しているようです。すなわち
using (profiler.Step("Test 2"))
{
sue = 1;
Thread.Sleep(0);
}
上記のコードを使用すると、テスト 2 は Miniprofiler の結果に表示されません。
using (profiler.Step("Test 2"))
{
sue = 1;
Thread.Sleep(10);
}
上記のコードを使用すると、テスト 2 が Miniprofiler の結果に表示されます。
したがって、私の LongRunningCodeToGenerateComplexData は非常に高速であることが判明したようです...しかし、Miniprofiler の予想される動作は、非常に短い時間しかかからないステップを表示しないのでしょうか?