Степпинг MVC Mini Profiler без вложенного использования - PullRequest
7 голосов
/ 29 февраля 2012

Мы моделируем сложную систему, основанную на сложных отношениях сущностей в Dynamics CRM 4.0

Из-за характера разработки нам пришлось реализовать шаблон стиля репозитория, и у нас было много разных поставщиков, которые связаны друг с другом.

Что я действительно хочу сделать, так это профилировать их конструкторов и различных ленивых получателей, но я хочу смоделировать это на самом высоком возможном уровне.

Проблема, конечно, в Scope - если я оберну конструктор в блоке using, он больше не будет доступен ни для чего другого. Если я расширяю блок using так, чтобы все, что ссылается на объект, который я профилировал, попадало в область видимости, то профилировщик не просто профилировал конструктор - он синхронизировал все остальное.

Точно так же, есть уровень вложенности. Если я правильно вложил использование, то код становится нечитаемым.

Я посмотрел на Profiler.Inline, но это не отвечает моим целям.

Что бы я действительно хотел сделать, это:

ref = Profiler.StartStep("Creating CRM Model");
//Do horrible CRM work
var myNewHorribleObject = CRM.ModelHorribleStuff(...);
Profiler.StopStep(ref);

ref = Profiler.StartStep("How long does it take to get X");
var data = Repository.GetSomething(myNewHorribleObject.SomeId);
Profiler.StopStep(ref);

ref = Profiler.StartStep("How long does it take to get Y");
var newData = Repository.GetSomethingElse(myNewHorribleObject.ContextId);
Profiler.StopStep(ref);

Имеет ли это смысл? Надеюсь, я что-то пропускаю в Mini Profiler, но буду рад любым советам!

Я бы хотел немного переделать код, но времени на это нет, и хотя он выглядит странно, у нас на самом деле довольно хорошая цикломатическая сложность.

1 Ответ

9 голосов
/ 29 февраля 2012

Да, это возможно. Вместо использования using просто используйте "MiniProfiler.Current.Step (" blah ")". Это вернет объект, который реализует IDisposeable. Когда этот объект фактически утилизируется, это время остановится. Вы можете даже вкладывать вещи с помощью операторов using, как обычно.

Пример:

 IDisposable executingStep;
 executingStep= MiniProfiler.Current.Step("Some code after this");
 // do long code
 Thread.Sleep(100);
 using (profiler.Step("Step 2313"))
 {
     Thread.Sleep(100);
 }
 executingStep.Dispose();
...