Приложение работает быстрее с визуальным анализом производительности студии
Я изучаю, сколько времени требуется для выполнения конкретной операции. Операция выглядит следующим образом:
Parallel.ForEach(items, item => SaveScheme(item));
Метод SaveScheme
работает с базой данных: выполняет некоторые запросы и работает с информацией. Количество элементов в коллекции items
может быть достаточно большим.
Когда я запускаю эту операцию, она занимает около 20-40 секунд. Но когда я запускаю его с включенным профилированием, это занимает всего 3 секунды!
Я не нашел никакой информации об этой проблеме. Мое единственное предположение: профилирование Parallel.ForEach
создает больше потоков, чем без него, но я не знаю точно, и даже если это правда, я не знаю, что с ним делать.
Итак, почему это происходит и как я могу архивировать эту производительность при запуске приложения без профилирования?
UPD. Parallel
не имеет ничего общего с этим: я протестировал с простым foreach
, а операция все еще завершена за 3 секунды!
Ответы
Ответ 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
Этот результат подсказывает, что ваше приложение, возможно, пытается быть слишком параллельным: ваши потоки фактически попадают друг в друга, или накладные расходы на создание ваших потоков больше, чем любое увеличение производительности. Об этом свидетельствует тот факт, что ваша неконкурентная версия работает быстрее!
Использование профилировщика повлияет на производительность вашего приложения; возможно, это замедляет ваш код настолько, что вы видите некоторую выгоду от нескольких потоков.
Без дополнительной информации о коде, лежащем в основе вашего метода, это наиболее вероятный ответ.