В Visual Studio 2008 SP1 появились ошибки во время выполнения, или я сошел с ума?
-
20-09-2019 - |
Вопрос
Я ломал голову, пытаясь понять, что, черт возьми, происходит с самой последней (не бета-версией) Visual Studio 2008 SP1:
Мое приложение, созданное с использованием OpenMP, работает в отладчике невероятно медленно, в результате чего загрузка ЦП достигает 100%.Когда они запускаются вне отладчика, он просто работает медленно (для сборки выпуска).
Мое приложение, созданное с использованием библиотеки Intel Thread Building Blocks или моей собственной реализации группы потоков, работает в отладчике медленнее, чем при запуске вне отладчика (для сборки выпуска).
Когда я перехожу на другую машину разработки, на которой не установлен SP1, ситуация меняется.Запуск в отладчике или вне его не влияет на производительность программы.OpenMP ускоряет мое приложение, как и блоки построения потоков или код моей собственной команды потоков (написанный в спешке из-за раздражения, чтобы разобраться в этой проблеме).
При этом в приложение не вносится никаких изменений, просто запустите его внутри или вне отладчика, SP1 по сравнению с обычной Visual Studio.
Я ничего не нашел об этом в Google, поэтому высовываю шею и говорю что-то в надежде, что кто-то еще поймет, что с ними происходит.Либо так, либо я что-то вижу.
Решение
Да.В определенных случаях.Мы столкнулись с аналогичной ситуацией крайнего замедления после перехода на SP1.Причиной этого были исключения.У нас была модель данных, в которой часто использовался шаблон попытки доступа к ключам в словаре, который терпел неудачу и перехватывал исключение:
try {
var a = dict[key];
} catch(KeyNotFoundException) {
dict[key] = default;
a = default;
}
Это всего лишь пример, но причиной было вообще любое исключение.По какой-то причине VS только в отладчике работает очень медленно.Заметьте, так было и раньше, но с новым патчем стало значительно хуже.
Решение состоит в том, чтобы просто всегда использовать тест.для приведенного выше примера словаря используйте .TryGet или проверку пользовательского кода, будет ли ваш вызов генерировать исключение перед его вызовом, если это что-то, что будет происходить часто (таким образом, это «ожидаемое» событие, а не «исключительное» событие) .
Больше информации: Исключения и производительность