2009-08-08 3 views
1

Visual Studio 2008 용 확장 프로그램을 만들고 있는데 C++ 용으로 자체 파서를 작성하고 싶지 않았기 때문에 (저는 자만적이지 않습니다) VCCodeModel을 사용하고 있습니다.Managed C++과 CodeModel 및 기타 COM 객체의 C# 성능

이러한 COM 개체에서 간단한 필드를 얻는 것은 내가하는 다른 작업보다 많은 시간이 걸리며, 매우 큰 C++ 프로젝트의 메서드 수준을 드릴 다운하기 때문에이 비효율은 가장 낮습니다 내 재귀 수준.

vcCodeBaseFunctions = ((Microsoft.VisualStudio.VCCodeModel.VCCodeElements) 
           (vcCM.Functions)); 
    int i = 0; 
    for (i = 1; i <= vcCodeBaseFunctions.Count; i++) 
    { 
    if (vcCodeBaseFunctions.Item(i).Kind == vsCMElement.vsCMElementFunction) 
       parent.AppendChild(MethodWrapper.VCCodeFunctionToXML(
          (VCCodeFunction)vcCodeBaseFunctions.Item(i))); 
    } 

위 코드는 프로젝트의 기본 수준에서 모든 기능을 반복하여 XML로 변환 한 다음 저장합니다. XML 메서드는 이름, 매개 변수 등과 같은 VCCodeFunction 내부의 여러 필드를 호출합니다.

이 목적으로 C#보다 관리가 더 빠르다. 관리되는 C++의 백엔드가 C#과 다른 점에 대해 제대로 이해하지 못했지만 C++에서 관리되는 코드와 관리되지 않는 코드 사이에 "컨텍스트 전환"비용이 적다는 사실을 직감으로 받아 들일 수 있습니까? CodeModel을 사용하여 C++에서 관리되는 코드와 관리되지 않는 코드 사이를 반복적으로 전환하는 것으로부터 느려지고 있습니다. 따라서 관리되는 C++이 더 빠를 것이라고 가정 할 때 올바른 것입니까?

답변

1

.NET에서 COM interop 계층에 오버 헤드가 있습니다. C++을 사용한다면 COM 액세스를 네이티브 코드로 옮길 수 있습니다. 그러면 코드 액세스의 속도가 빨라질 것입니다.

그러나 C++/CLI를 사용할 계획이라면 어느 시점에서 네이티브 -> 관리 된 interop을 가질 수 있습니다. 체인 외부의 곳에서 데이터를 마샬링 할 수 있습니다.이 루프 외부에서이 작업을 수행 할 수 있다면 조금 더 빨라질 수 있습니다. 재귀를 100 % 기본으로하면 interop 호출 수가 훨씬 적습니다.

VCCodeModel은 특히 빠르지 않습니다. COM 상호 운용성을 사용하여 약간의 오버 헤드가 발생한다는 사실에 동의하지만, 사용중인 프로파일 러가 과장되어있을 수 있습니다. 추적 프로파일 러를 사용하는 경우 프로파일 링 중에 이러한 호출에서 실제 릴리스 실행보다 많은 시간을 소비하게되므로 특히 그렇습니다. 프로파일 러는 완벽하지 않으며 프로파일 러 때문에 왜곡 된 결과를 얻는 경우 일 수 있습니다.

나는 당신의 잠재적 인 속도 향상이 포트를 공략 할 수 없다고 생각합니다 - 더 많은 정보가 없으면 확실하게 알기는 어렵습니다.

+0

"추적 프로파일 러 (traceing profiler)"가 프로파일 링 결과를 왜곡하는 방법을 구체적으로 설명 할 수 있습니까? 가장 낮은 수준의 재귀 호출에서 COM 개체 데이터 멤버에 대한 호출이 12 건 정도 발생한다고 말하면 어떤 변화가있을 것이라고 생각하십니까? 관련된 모든 필드가 추출 된 큰 C++ 프로젝트의 모든 메소드? 이것은 COM interop이 진행되고있는 것처럼 보이지만 잘 모르겠습니다. – user142350

+1

모든 프로파일 러가 결과를 왜곡하는 방법에 대한 자세한 내용은 샘플링 프로파일 러에 대한 추적을 읽으십시오. 가장 큰 문제는 JIT에서 최적화 및 인라이닝을 완전히 비활성화해야하고 모든 메소드 호출이 작업 속도를 저하시키는 것입니다. 당신에게 네이티브 C++로가는 것은 확실히 빠를 것입니다. 그러나 얼마나 빨라 졌는지에 대한 질문입니다. 나는 아주 작은 이익을 보게 될 것이라고 기대할 것입니다. 그래서 속도 이득이 얼마나 중요한지에 달려 있습니다. 최적화는 거의 항상 작업/요구와 균형의 균형입니다. 현재 상황이 얼마나 나쁜지, 얼마나 많이 향상시킬 수 있습니까? 얼마나 많은 노력이 필요합니까? –

+0

그래, 그건 의미가있다. 당신은 내 질문에 대답했다. 그러나 "나는 네이티브 C++에서 코드 모델을 10 배나 만들 수있다"고하지 않았습니다. 나는 희망했다. – user142350

0

추가 기능/패키지 언어 속도는 코드 모델의 속도에 비해 아무것도 없습니다. 편집 : 좋아, 어쩌면 나는 배 밖으로 갔다. 그러나 진지하게, 여기의 첫번째 문장은 정확하다.

+0

나는 codododel이 빠르다고 말하지 않는다. 내가 말하고있는 것은 COM codemodel 객체의 필드에 접근하는 것이 거의 모든 프로세서 시간 (ANTS에서이 애드온을 프로파일 링했습니다)입니다. 현재 C#을 사용하고 있으며 관리되는 C++가 더 빠를 지 궁금합니다. – user142350

0

C++은 더 빠를 것 같지 않습니다.

고객님의 파서가 일 수 있습니다. 물론 파서 작성은 상당히 오래 걸릴 수 있습니다.

+0

관리되는 C++에서 비 관리 코드를보다 쉽게 ​​참조 할 수 있습니까? .NET Framework와 관리되지 않는 코드 사이의 "컨텍스트 전환"이 C++에서 다른 것입니까 아니면 구문적인 차이일까요? – user142350