Очень медленный код C # с подключенным отладчиком; Ошибка MemoryMappedFile?

У меня есть клиент-серверное приложение. Серверный компонент работает, использует WCF в режиме «удаленного взаимодействия» (двоичное форматирование, объекты сеанса).

Если я запускаю серверный компонент и запускаю клиента, первая задача, которую выполняет сервер, завершается за <0,5 секунды.

Если я запускаю серверный компонент с подключенным отладчиком VS, а затем запускаю клиент, задача занимает более 20 секунд для выполнения.

Нет изменений кода - нет изменений условной компиляции. То же самое происходит независимо от того, скомпилирован ли у меня серверный компонент и работает в 32-битном или 64-битном режиме, с процессом хостинга VS, без процесса хостинга VS или в любой их комбинации.

Возможно, важно : если я использую профилировщик VS.NET (режим выборки), приложение запускается так же быстро, как если бы к нему не подключался отладчик. Так что я не могу так диагностировать. Только что проверил, инструментальный режим тоже работает шустро. То же самое для режима профилирования параллелизма, работает быстро.

Ключевые данные:

  • Приложение использует довольно тяжелую многопоточность (40 потоков в стандартном пуле потоков). Несмотря на это, создание потоков происходит быстро и не является медленным. Существует множество блокировок, паттернов WaitHandle и Monitor
  • . Приложение вообще не вызывает никаких исключений.
  • Приложение не выводит на консоль.
  • Приложение представляет собой полностью управляемый код.
  • Приложение отображает несколько файлов на диске в MemoryMappedFile: 1x750MB и 12x8MB и несколько файлов меньшего размера

Измеренная производительность:

  • Использование ЦП минимально в обоих случаях; когда подключен отладчик, загрузка ЦП <1%
  • Использование памяти минимально в обоих случаях; возможно, 50 или 60 МБ в обоих случаях
  • Произошло множество ошибок страниц (см. MMF), однако они происходят медленнее, когда подключен отладчик
  • Если процесс хостинга VS не используется, или в основном «удаленная отладка» monitor ', затем , что использует приличный объем ЦП и создает большое количество ошибок страниц. Но это не единственный раз, когда возникает проблема
  • . Разница в производительности видна независимо от того, как запущен клиент. Единственная изменяемая переменная - это серверный компонент, запускаемый через «Начать с отладкой», а не запускаемый из проводника.

Мои идеи:

  • WCF работает медленно при отладке?
  • MemoryMappedFiles работает медленно при отладке?
  • Используется 40 потоков - медленно выполняется отладка? Возможно, мониторы / блокировки уведомят отладчик? Планирование потоков становится странным / переключение контекста происходит очень редко?
  • Космический фон, наделяющий VS разумом и жестоким чувством юмора

Все это кажется глупо маловероятным.

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

  1. Почему это происходит?
  2. Если №1 неизвестно, как я могу диагностировать / выяснить?
9
задан Kieren Johnstone 19 October 2011 в 21:14
поделиться