Visual Studio 2008 Очень медленная отладка Управляемый в неуправляемый переход (хотя только одна машина) - PullRequest
1 голос
/ 10 января 2012

У меня есть некоторый код C #, который передал делегата в качестве обратного вызова неуправляемому методу через вызов функции P / Invoke в тесте NUnit.

Код отлично работает и проходит все тесты как в Relase, так и в Debugрежимы.И он работает на одной машине быстро, независимо от того, работает он под Debugger или нет.

Но после настройки практически идентичной среды разработки на другом ПК для начинающего разработчика, начинающегося в ближайшее время, он быстро работает в конфигурации Release и Debug.Но ужасно медленно, когда подключен отладчик.

Обратите внимание, что я видел тип медлительности с включенным «Отладка неуправляемого кода» в проекте.Я отключил это, перекомпилировал, и это не имеет значения с или без.Я пробовал оба способа несколько раз.

Кроме того, нет никаких точек останова или установленных переменных наблюдения.

Кроме того, этот модульный тест фактически вызывает неуправляемый метод в цикле 1миллион раз, который возвращается после увеличения счетчика.Это чрезвычайно простой код, который только проверял производительность выполнения неуправляемых вызовов между доменами приложений.

Пожалуйста, помните, что это идентичный код из git commit, который работает медленно только в режиме отладчика на одной из машин.Никакие модификации кода между ними не различаются, поэтому кажется, что это не проблема «кода», а скорее настройка в Visual Studio, где-то, связанная с неуправляемой или управляемой отладкой, я буду дико спорить.

Заранее спасибоза любые идеи.Если вы действительно думаете, что просмотр кода поможет.Я также опубликую модульный тест на C # и файл cpp.

Редактировать: я сузил, что эта медлительность в отладчике происходит только для неуправляемого кода, который вызывает в другой домен приложения.Таким образом, в этих тестах производительности есть основной и другой, вторичный AppDomain.Управляемые на неуправляемые вызовы проверяются на обратный вызов из основного домена к себе.Это быстро!Но те, которые обратного вызова из неуправляемого в другой AppDomain очень, очень медленно.Это означает от 20 миллионов в секунду до всего лишь 4 или 5 тысяч в секунду.

Обратите внимание, что метод, вызываемый для проверки, является void callback () - поэтому не аргументы или возвращаемое значение.Другими словами, маршаллу нечего.

Редактировать: я был jiggerng с другими настройками, и теперь моя коробка разработки тоже МЕДЛЕННАЯ.Я был уверен, что это был параметр «Просто мой код», который отключил для более быстрой машины, поэтому позволил ей попробовать это.Но теперь, даже после его отключения, все еще медленно.Поэтому не уверен, является ли это причиной или нет.

1 Ответ

2 голосов
/ 10 января 2012

Проверьте, одинаковы ли настройки файлов символов на обеих машинах.Загрузка всех символов для собственного кода может занять очень много времени (Сервис -> Параметры -> Отладка -> Символы).

...