Приложение работает быстрее с визуальным анализом производительности студии - программирование

Приложение работает быстрее с визуальным анализом производительности студии

Я изучаю, сколько времени требуется для выполнения конкретной операции. Операция выглядит следующим образом:

Parallel.ForEach(items, item => SaveScheme(item));

Метод SaveScheme работает с базой данных: выполняет некоторые запросы и работает с информацией. Количество элементов в коллекции items может быть достаточно большим.

Когда я запускаю эту операцию, она занимает около 20-40 секунд. Но когда я запускаю его с включенным профилированием, это занимает всего 3 секунды!

Я не нашел никакой информации об этой проблеме. Мое единственное предположение: профилирование Parallel.ForEach создает больше потоков, чем без него, но я не знаю точно, и даже если это правда, я не знаю, что с ним делать.

Итак, почему это происходит и как я могу архивировать эту производительность при запуске приложения без профилирования?


UPD. Parallel не имеет ничего общего с этим: я протестировал с простым foreach, а операция все еще завершена за 3 секунды!

4b9b3361

Ответ 1

Я нашел ответ:

Причина в том, что при запуске приложения в Visual Studio, к нему прикреплен отладчик. Когда вы запускаете его, используя профайлер, отладчик не подключен.

Если вы попытаетесь запустить .exe самостоятельно или запустите программу через IDE с "Debug > Start Without Debugging" (или просто нажмите Ctrl + F5) приложение должно работать так же быстро, как и с профилировщиком.

fooobar.com/questions/325989/...

Я не нашел его раньше, потому что думал, что причина concurrency.

Ответ 2

Я подозреваю, что вы на самом деле профилируете только часть "не паракрал" вашего приложения.

Я бы предложил посмотреть здесь: http://msdn.microsoft.com/en-us/library/gg663532.aspx

Ответ 3

Может ли быть, что при профилировании вы замедлили (и уменьшили concurrency) фактического генерации базы данных, что вы эффективно дросселировали узкое место - да база данных (или....).

Ответ 4

Этот результат подсказывает, что ваше приложение, возможно, пытается быть слишком параллельным: ваши потоки фактически попадают друг в друга, или накладные расходы на создание ваших потоков больше, чем любое увеличение производительности. Об этом свидетельствует тот факт, что ваша неконкурентная версия работает быстрее!

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

Без дополнительной информации о коде, лежащем в основе вашего метода, это наиболее вероятный ответ.