C# код очень медленно с прикрепленным отладчиком; Ошибка памяти

StackOverflow https://stackoverflow.com/questions/7828041

Вопрос

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

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

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

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

Возможно важно: Если я использую vs.net Профилировщик (Режим отбора проб), тогда приложение работает так быстро, как если бы не было приложено отладчика. Так что я не могу диагностировать это таким образом. Только что проверял режим инструментов также работает быстро. То же самое для режима профилирования параллелизма, работает быстро.

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

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

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

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

Мои идеи:

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

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

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

  1. Почему это происходит?
  2. Если #1 неизвестно, как я могу диагностировать / узнать?
Это было полезно?

Решение

Исключения могут особенно повлиять на производительность приложения. Существует два типа исключений: 1 -й шанс исключения (один из изящно обрабатывается с помощью блока Try/catch) и невозможных исключений (которые в конечном итоге будут разрушать приложение).

По умолчанию отладчик не показывает исключения из 1 -го шанса, он просто показывает непрерывные исключения. И по умолчанию это также показывает только исключения, возникающие в вашем коде. Однако, даже если он не показывает их, он все еще обрабатывает их, поэтому его производительность может быть затронута (особенно в испытаниях нагрузки или больших циклов).

Чтобы включить 1 -е шанс исключения отображения в Visual Studio, нажмите на «Debug | Exceptions», чтобы вызвать диалоговое окно исключения, и проверьте «брошенные» в разделе «Общий язык выполнения» (вы можете быть более конкретны увидеть).

Чтобы включить 1 -й шанс исключения отображаются из любой точки приложения, а не только из вашего кода, нажмите «Инструменты | Параметры | Отладка | Общие» и отключите опцию «Включить только мой код».

И для этих конкретных случаев «режима криминалистики» я также настоятельно рекомендую включить шаг .NET Framework источник (необходимо «включить только мой код» отключить). Очень полезно понять, что происходит, иногда просто смотреть на стек вызовов очень вдохновляет - и полезно, особенно в случае с космическим радиационным микшированием :-)

Две связанные интересные статьи:

Другие советы

Поскольку это один из первых результатов, когда я Googling для этой проблемы я хотел бы добавить свое решение здесь в надежде сэкономить кому -то 2 часа исследования, как в моем случае.

Мой код замедлился с 30 секунд без отладчика, прикрепленного к 4 минутам с отладчиком. Потому что я забыл удалить условную точку останова. Кажется, они сильно замедляют исполнение, так что следите за этим

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top