В Visual Studio 2008 SP1 появились ошибки во время выполнения, или я сошел с ума?

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

Вопрос

Я ломал голову, пытаясь понять, что, черт возьми, происходит с самой последней (не бета-версией) 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 или проверку пользовательского кода, будет ли ваш вызов генерировать исключение перед его вызовом, если это что-то, что будет происходить часто (таким образом, это «ожидаемое» событие, а не «исключительное» событие) .

Больше информации: Исключения и производительность

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