Запуск VS Profiler повышает производительность приложений x20? - PullRequest
7 голосов
/ 24 марта 2011

РЕДАКТИРОВАТЬ 1
Я не исключаю, что это может быть вызвано чем-то очень основным побочным эффектом использования Profiler (некоторые неправильные настройки в моем "обычном" проекте)

Я хотел улучшить время вычислений в своем приложении, поэтому решил провести тщательный анализ профилирования. Итак, Я только что запустил профилирование распределения памяти .Net для анализа своего приложения.
Я был совершенно ошеломлен, наблюдая, как вычисления идут в 20 раз быстрее !

Приложение состоит из чтения данных из двоичных файлов с помощью BackgroundWorkers, их обработки,
и сохранения результатов в базе данных MSSQL. Каждый раунд обычно занимает 20 секунд, а при профилировании - 1 секунда. Я проверил и убедился, что результаты согласованы в обоих случаях.

Экспериментальный друг .Net сказал мне, что профилировщик оптимизирует многопоточность и «каким-то образом» находит свой путь через блокировки и узкие места, но я просто не могу в это поверить.

Итак, мои вопросы:

  1. ЧТО ТОЛЬКО ПРОИСХОДИТ, КАК И ПОЧЕМУ?
  2. Как заставить мой код так себя вести?

РЕДАКТИРОВАТЬ 2
Я ЗНАЮ это звучит безумно и невероятно. Я сам по-прежнему очень подозрительно. Но это ИСТИНА.
ЖЕ код работает очень быстро, когда запускается профилировщиком. Я использую одни и те же тестовые данные и наблюдаю за теми же компьютерными данными. Я не могу выдать простой репродуцируемый проект, так как это относительно большая структура. Я использую Visual Studio 2010 Profiler.

Я дам как можно больше подробностей о потоке и обязательно опубликую подсказку, как только найду.

Обычные журналы запуска:
23.03.2011 18:04:34 | 180434,621 | МОДЕЛИРУЮЩИЙ КОМПЛЕКТ [5] - [1] - [5 PC-1 0 [SET 1/48]
23.03.2011 18:05:01 | 180501.271 | ВРЕМЯ ОБРАБОТКИ: 00: 00: 26.6515244
и т.д ..

Журналы запуска профилировщика:
24.03.2011 11:38:15 | 113815,592 | МОДЕЛИРУЮЩИЙ КОМПЛЕКТ [5] - [1] - [5 PC-1 0 [SET 1/48]
24.03.2011 11:38:17 | 113817,350 | ВРЕМЯ ОБРАБОТКИ: 00: 00: 01.7581005

и т.д ..

РЕДАКТИРОВАТЬ 3: Подсказка
Ok ok ok Мой BAD (я предупреждал о такой возможности при редактировании 1, поскольку это было слишком невероятно. Извините) @Watts предложил проверить, был ли я в режиме отладки или выпуска. Что я уже сделал. НО @SnowBear указал, что есть две разные вещи: запустить отладочную версию программного обеспечения и запустить программное обеспечение под отладчиком Я удостоверился, что активная конфигурация была RELEASE и в Build, и в исполнении VS2010. Однако, поскольку я только сходил с ума, я решил запустить Приложение непосредственно из exe-файла в bin / release. И вуаля ... процессы занимали 1 секунду каждый. Запуск Profiler выведет вас из режима отладки (будь вы в режиме выпуска или в режиме отладки) это то, что привело меня в замешательство.
Спасибо, что все дело закрыто.

Ответы [ 3 ]

5 голосов
/ 24 марта 2011

Работа с отладчиком отключает JIT-оптимизацию.Если вы запускаете exe, обычно Jit-оптимизация будет включена.Присоединение отладчика к такому запущенному приложению позволяет отлаживать его с включенной оптимизацией.

Release-Build против Debug-Build имеет два последствия:

  1. Условный символ компилятора () определены
  2. Включает / отключает оптимизацию в компиляции C # => IL.
0 голосов
/ 20 ноября 2013

Я сталкивался с этим много раз ... Для этого есть очень простое объяснение.Профилировщик не располагает объектами, поэтому при профилировании стоимость его удаления не возникает.

Таким образом, если вы хотите улучшить производительность, чтобы она соответствовала профилированной производительности, выясните, где вы создаете экземпляры всех этих недолговечных объектов, и выполните рефакторинг кода.

Я неПока что я знаю действительно отличный способ немедленно найти код, вызывающий нарушение, но я могу помочь вам сузить его.Если вы профилируете свой код, откроете отчет, выберите «Функции» в качестве текущего представления, а затем отсортируете по включенным примерам, вы увидите лучшие методы ... Ваша проблема с производительностью для экземпляров объектов, вероятно, связана с одним из этихметоды с наиболее инклюзивными образцами.

0 голосов
/ 27 апреля 2012

Учитывая, что вопрос касается кода, выполняющегося быстрее под профилировщиком, и что конкретные вопросы звучат так: «1. ЧТО ТОЛЬКО ПРОИСХОДИТ, КАК И ПОЧЕМУ?» И 2. Как заставить мой код вести себя так же изначально? » принятый ответ неверен, поскольку он вообще не обращается к профилировщику и не упоминает конкретную причину ускорения в 20 раз.

Что именно происходит, так это:

На вкладке «Отладка» в свойствах вашего проекта установлен флажок «Включить отладку неуправляемого кода»; эта опция заставляет отладчик работать медленно как патока.

Когда вы запускаете профилировщик, это все еще отлаживаемая версия вашей программы, которую вы профилируете, поэтому символ "DEBUG" определен, и все трассировки, утверждения и т. Д. Включены, но отладчик не задействован. поэтому опция «Включить отладку неуправляемого кода» не применима. (JIT-оптимизации, вероятно, включены во время профилирования, но это не учитывает даже 2-кратное повышение производительности, не говоря уже о 20-кратном повышении.)

Если вы хотите насладиться этим 20-кратным увеличением во время отладки кода (не только во время профилирования), перейдите на вкладку «Отладка» в свойствах вашего проекта и убедитесь, что «Включить отладку неуправляемого кода» не отмечено.

приписка

Существует вопрос, дубликат которого несколько месяцев старше этого: Как получилось, когда я выбираю профиль программы, и она на самом деле работает быстрее, чем не профилирует?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...