В Visual Studio 2008 с пакетом обновления 1 (SP1) появились ошибки времени выполнения или я сумасшедший? - PullRequest
2 голосов
/ 31 августа 2009

Я ломал голову над тем, чтобы понять, что, черт возьми, происходит с самой последней (не бета) Visual Studio 2008 SP1:

Мое приложение, построенное на OpenMP, работает в отладчике невероятно медленно, доводя загрузку ЦП до 100%. Когда они запускаются вне отладчика, он просто работает медленно (для сборки выпуска).

Мое приложение, созданное с помощью библиотеки Intel Thread Building Blocks, или моя собственная команда потоковой работы, работает в отладчике медленнее, чем при запуске вне отладчика (для сборки выпуска).

Когда я перехожу на другой компьютер для разработки, на котором не установлен SP1, ситуация другая. Работа в отладчике или вне его не влияет на производительность программы. OpenMP ускоряет мое приложение, также как и Thread Building Blocks или мой собственный код команды потоков (написанный на скорую руку, чтобы выяснить эту проблему).

Это абсолютно без изменений в приложении, просто запустите его внутри или снаружи отладчика SP1 по сравнению с обычной Visual Studio.

Я ничего не нашел об этом в Google, поэтому высовываю себе шею и говорю что-то в надежде, что кто-то еще может распознать, что это происходит с ними. Либо так, либо я вижу вещи.

1 Ответ

2 голосов
/ 03 сентября 2009

Да. В определенных случаях. Подобная ситуация была крайне замедленной после перехода на SP1. Причиной этого были исключения. У нас была модель данных, которая часто использовала шаблон попыток доступа к ключам в словаре, его сбоя и перехвата исключения:

try {
  var a = dict[key];
} catch(KeyNotFoundException) {
  dict[key] = default;
  a = default;
}

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

Решение состоит в том, чтобы просто всегда использовать тест. для приведенного выше примера словаря используйте .TryGet или в пользовательском коде проверьте, будет ли ваш вызов сгенерировать исключение перед вызовом, если это что-то случится много (таким образом, это «ожидаемая» вещь, а не «исключительная») .

Подробнее: Исключения и производительность

...