Здравствуйте, hyp1k, Вы писали:
H>Редко пользуюсь профайлером, помогите разобраться. Есть конструктор некоего класса, запускаю профайлер, смотрю значение Elapsed Inclusive Time для этого конструктора вижу 1,302,050.38 (22 минуты). Думаю: "странно?!". Ограничиваю место вызова конструктора брейкпоинтами засекаю время вручную, отрабатывает за 4 минуты. Других мест вызова конструктора нет. Метод профилирования — Instrumentation. Чего я не понимаю?
1. Instrumentation замедляет выполнение кода, особенно если код в основном занят делом, а не висит в блокировках/вводе-выводе.
2. Не смотрите на точное время, смотрите на соотношение затрат на вызовы внутри конструктора. Он же не сам по себе тормозит
3. Важно правильно мерять время. Если код — числомолотилка, да ещё и с динамическим раскидыванием кода по потокам, то лучше смотреть на sampling + Thread time. Для типового биз-кода с кучей запросов/блокировок etc — wall time. Подробнее — в документации к вашему профайлеру. Для dottrace —
тынц.
4. 4 минуты на конструктор — это адов пипец, простите мой французский. Не надо так делать.
Здравствуйте, hyp1k, Вы писали:
H>Моя проблема в том, что я смотрю и не понимаю, например в конструкторе вызывается самый тормозной метод. В студии пишется вот так:
H>ManAcc.Service.ReportBuilder.HeadReportDelimiterTree.<>c__DisplayClass37.<CreateDelimitersByAlgoritm>b__2c(class ManAcc.Service.ReportBuilder.HeadReportDelimiter)
H>Шо за c_DisplayClass, шо за b_2c.
Это код, сгенеренный компилятором из лямбды. Dottrace и профайлер студии умеет показывать корректный исходный код, как насчёт остальных — не знаю.
Лямбда живёт в методе CreateDelimitersByAlgoritm, тип ManAcc.Service.ReportBuilder.HeadReportDelimiterTree.
H>Как оно может тормозить забирая Id у меня в голове не укладывается?
Или профайлер ошибается, или реальный код отличается (например, сгенерен прокси-тип и значения подтягиваются по сети), или вызовов там миллиарды. Других вариантов у меня пока нет
H>Тут тоже засада, мне не везет При sampling у меня на ноуте Win 8 падает critical structure corruption. К сожалению не 8.1 Дома буду пробовать на стационарном компьютере.
А, да. Instrumentation тож можно настраивать обычно, что-то типа "Exclude small functions from instrumentation" может помочь.
H>Согласен, внесли тут в систему конфигурацию отчета, которая показала слабое программы, поэтому и смотрю, что можно сделать. Говорят нельзя с нуля написать работающий код, его можно только оптимизировать, так что выкинуть и переписать с нуля не выход?!
Врут. Если использовать профайлер регулярно — то и с производительностью проблем не будет. Но это надо определиться с критериями производительности, написать сценарии для тестов и желательно как-нить автоматизировать сбор и обработку результатов. Короче, недешёвое удовольствие
Тормоза сами по себе — это ещё полбеды. Проблема в том, что у вас тормозит код в конструкторе, обычно это означает, что код или вообще не проверяли на предмет узких мест, или что нашлась ошибка в архитектуре приложения. Обычно долгие операции стараются выносить из конструктора, просто потому что правильно обработать отмену, асинхронность или ошибки в конструкторе — удовольствие ниже среднего.
Редко пользуюсь профайлером, помогите разобраться. Есть конструктор некоего класса, запускаю профайлер, смотрю значение Elapsed Inclusive Time для этого конструктора вижу 1,302,050.38 (22 минуты). Думаю: "странно?!". Ограничиваю место вызова конструктора брейкпоинтами засекаю время вручную, отрабатывает за 4 минуты. Других мест вызова конструктора нет. Метод профилирования — Instrumentation. Чего я не понимаю?
Sinix, спасибо за ответ.
S>1. Instrumentation замедляет выполнение кода, особенно если код в основном занят делом, а не висит в блокировках/вводе-выводе.
окей, я не знал
S>2. Не смотрите на точное время, смотрите на соотношение затрат на вызовы внутри конструктора. Он же не сам по себе тормозит
Моя проблема в том, что я смотрю и не понимаю, например в конструкторе вызывается самый тормозной метод. В студии пишется вот так:
ManAcc.Service.ReportBuilder.HeadReportDelimiterTree.<>c__DisplayClass37.<CreateDelimitersByAlgoritm>b__2c(class ManAcc.Service.ReportBuilder.HeadReportDelimiter)
Шо за c_DisplayClass, шо за b_2c.
Жму ViewSource, ну вроде бы показывает медленное место, устанавливается курсор на строчку кода. Но соотнести в точности с надписью выше, я не могу этот кусок кода.
Дальше еще веселее, под вот этим куском кода в дереве идет вызов через ORM к свойству, где программа тормозит 90 процентов времени, из-за огромного количества вызовов
ManAcc.Model.Company.ReportBlock.get_ParentBlock_Id()
Как оно может тормозить забирая Id у меня в голове не укладывается?
Вот такой код сгенерирован
[DataMember]
public Nullable<int> ParentBlock_Id
{
get { return _parentBlock_Id; }
set
{
if (_parentBlock_Id != value)
{
ChangeTracker.RecordOriginalValue("ParentBlock_Id", _parentBlock_Id);
if (!IsDeserializing)
{
if (ParentBlock != null && ParentBlock.Id != value)
{
ParentBlock = null;
}
}
_parentBlock_Id = value;
OnPropertyChanged("ParentBlock_Id");
}
}
}
private Nullable<int> _parentBlock_Id;
S>3. Важно правильно мерять время. Если код — числомолотилка, да ещё и с динамическим раскидыванием кода по потокам, то лучше смотреть на sampling + Thread time. Для типового биз-кода с кучей запросов/блокировок etc — wall time. Подробнее — в документации к вашему профайлеру. Для dottrace — тынц.
Тут тоже засада, мне не везет
При sampling у меня на ноуте Win 8 падает critical structure corruption. К сожалению не 8.1 Дома буду пробовать на стационарном компьютере.
S>4. 4 минуты на конструктор — это адов пипец, простите мой французский. Не надо так делать.
Согласен, внесли тут в систему конфигурацию отчета, которая показала слабое программы, поэтому и смотрю, что можно сделать. Говорят нельзя с нуля написать работающий код, его можно только оптимизировать, так что выкинуть и переписать с нуля не выход?!
Здравствуйте, Sinix
Профилировщик от jetbrains показал более ожидаемые результаты, а студийный профилировщик (vs2010) оказывается делает BSOD в режиме sampling
из-за безопасноти в вин8 .
Ну и с режимом instrumentation от vs не сошлись результаты видимо в вин8 плохо работает профайлер