Visual Studio 2008 SP1이 런타임 버그를 소개 했습니까? 아니면 미쳤습니까?
-
20-09-2019 - |
문제
나는 가장 최근의 (비 베타) Visual Studio 2008 SP1에서 도대체 무슨 일이 일어나고 있는지 알아 내려고 뇌를 rack습니다.
OpenMP로 구축 된 내 앱은 디버거에서 엄청나게 느리게 실행되어 CPU 사용량을 100%로 가져옵니다. 디버거 밖에서 실행되면 단지 릴리스 빌드의 경우 천천히 실행됩니다.
인텔 스레드 빌딩 블록 라이브러리 또는 자체 스레드 팀 구현으로 구축 된 내 앱은 디버거 밖에서 (릴리스 빌드)를 실행할 때보 다 디버거에서 느리게 실행됩니다.
SP1을 설치하지 않은 다른 개발 기계로 이동하면 상황이 다릅니다. 디버거 또는 외부에서 실행하면 프로그램 성능에 영향을 미치지 않습니다. OpenMP는 스레드 빌딩 블록 또는 내 스레드 팀 코드 (이 문제를 파악하기 위해 급히 쓰여진)와 마찬가지로 내 응용 프로그램을 가속화합니다.
이것은 앱에 대한 변경 사항이 전혀 없으며 Debugger, SP1과 정기적 인 Visual Studio의 내부 또는 외부를 실행합니다.
나는 Google에서 이것에 대해 아무것도 찾지 못했기 때문에 목을 내밀고 다른 사람이 이것이 그들에게 일어나고 있음을 인식 할 수 있기를 희망하는 무언가를 말하고 있습니다. 그 중 하나 또는 나는 물건을보고 있습니다.
해결책
예. 경우에 따라. SP1로 전환 한 후 비슷한 속도가 저하되는 상황이 발생했습니다. 이것의 원인은 예외였습니다. 우리는 사전에서 키에 액세스하고 실패하고 예외를 포착하려는 패턴을 많이 사용하는 데이터 모드를 가지고있었습니다.
try {
var a = dict[key];
} catch(KeyNotFoundException) {
dict[key] = default;
a = default;
}
이것은 단지 예일 뿐이지 만 원인은 전혀 예외였습니다. 어떤 이유로 든 디버거에서만 VS는 매우 느립니다. 참고, 이것은 이전의 경우 였지만 새로운 패치에서는 훨씬 더 나빴습니다.
해결책은 단순히 항상 테스트를 사용하는 것입니다. 위의 사전 예제의 경우, .ryget 또는 사용자 정의 코드를 사용하여 호출을 호출하기 전에 예외를 생성하는지 확인하십시오. .
더 많은 정보: 예외와 성능