2011-02-08 3 views
2

VS 2008을 사용하여 코드를 컴파일하고 디버깅하고 있습니다. 내 응용 프로그램에서 프론트 엔드는 C#이고 백엔드는 C++입니다. interop을 통해 C++ 코드에 액세스합니다.디버거를 연결하면 .Net 코드에서 C++ DLL을 호출하는 것이 느려집니다.

내가 알아 차린 사실 중 하나는 F5 키를 눌러 네이티브 코드의 디버그 버전에 연결하면 네이티브 코드를 실행하는 데 20 초 이상 걸리는 것입니다. 네이티브 코드의 릴리스 버전에 링크하면 실행하는 데 필요한 시간이 7-8 초로 단축됩니다.

VS 2008 디버거가 연결되어 있지 않은데 (예 : IDE 외부에서 exe를 클릭 한 경우) C++ 코드의 릴리스 버전에 연결하면 실행하는 데 1 초 밖에 걸리지 않습니다. C++ 코드.

모든 테스트에서 C++ 코드에 대한 입력은 항상 항상 동일하다는 점에 유의하십시오.

확실히, 디버거 및 디버그 빌드의 첨부와 관련된 일부 오버 헤드가 있습니다. 하지만 성능의 차이가 너무 큽니다. 제가 놓친 것이 있을까요 아니면 조정할 수 있습니까?

나는 이것이 매우 수수께끼 인 것을 알았다. 내 경험에 비추어 볼 때 C#은 디버거로 실행 중인지 또는 디버그 모드로 실행 중인지에 관계없이 많은 오버 헤드를 발생시키지 않습니다.

+0

왜 이런 일이 일어 나는지 모르지만 나는 여러 번 보았고 그 주위에 어떤 방법도 찾지 못했습니다. 나는 unmarshed 코드와 marshed 코드 사이의 jit 디버거가 잘 조정되지 않았다고 가정합니다. – madmik3

답변

3

가장 좋은 추측은 디버깅 기호를로드하면 속도가 느려지는 것입니다. 모든 Windows 시스템 라이브러리의 심볼 파일을 자동으로로드하도록 설정된 순수하게 관리되지 않는 C++ 프로젝트에서 똑같은 일이 일어나는 것을 보았습니다. 디버깅 기호를 자동으로로드하지 않도록하십시오.

  1. "도구"메뉴에서 "옵션"을 클릭하십시오.
  2. "디버깅"카테고리를 왼쪽으로 펼치고 "심볼"하위 카테고리를 선택하십시오.
  3. "기호를 수동으로로드 한 경우에만 위의 위치 검색"확인란을 선택하십시오. 또한

    Check "Search the above locations only when symbols are loaded manually"


, 그 혼합 모드 디버깅을 고려 매우 느립니다. 당신은 C++ DLL의 코드를 한 단계 씩 할 수있는 기능이 필요하지 않은 경우

, 당신은 당신의 프로젝트의 속성에서 "관리되지 않는 코드 디버깅 사용"옵션을 해제하려고 할 수 있습니다

    Uncheck "Enable unmanaged code debugging"

+0

또는 C++ 코드로 들어갈 필요가 있지만 C# 코드를 실행하지 않고도 살 수있는 경우 (이 하나의 디버깅 세션의 경우에도) C++ DLL 프로젝트를 시작 프로젝트로 설정할 수 있습니다. –

+0

@Ciaran : C++ DLL이 실제로 시작 프로젝트가 아닌 경우 어떻게 작동할까요? 즉, C# 프로젝트에 응용 프로그램을 부트 스트랩하는 데 필요한 시작 코드가 들어 있고 DLL이 라이브러리 함수 일뿐입니다. –

+0

@Cody Grey, 디버그시 C# 실행 파일을 시작하는 방식으로 DLL 프로젝트를 설정할 수 있습니다. – YeenFei

관련 문제