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++이 더 빠를 것이라고 가정 할 때 올바른 것입니까?
"추적 프로파일 러 (traceing profiler)"가 프로파일 링 결과를 왜곡하는 방법을 구체적으로 설명 할 수 있습니까? 가장 낮은 수준의 재귀 호출에서 COM 개체 데이터 멤버에 대한 호출이 12 건 정도 발생한다고 말하면 어떤 변화가있을 것이라고 생각하십니까? 관련된 모든 필드가 추출 된 큰 C++ 프로젝트의 모든 메소드? 이것은 COM interop이 진행되고있는 것처럼 보이지만 잘 모르겠습니다. – user142350
모든 프로파일 러가 결과를 왜곡하는 방법에 대한 자세한 내용은 샘플링 프로파일 러에 대한 추적을 읽으십시오. 가장 큰 문제는 JIT에서 최적화 및 인라이닝을 완전히 비활성화해야하고 모든 메소드 호출이 작업 속도를 저하시키는 것입니다. 당신에게 네이티브 C++로가는 것은 확실히 빠를 것입니다. 그러나 얼마나 빨라 졌는지에 대한 질문입니다. 나는 아주 작은 이익을 보게 될 것이라고 기대할 것입니다. 그래서 속도 이득이 얼마나 중요한지에 달려 있습니다. 최적화는 거의 항상 작업/요구와 균형의 균형입니다. 현재 상황이 얼마나 나쁜지, 얼마나 많이 향상시킬 수 있습니까? 얼마나 많은 노력이 필요합니까? –
그래, 그건 의미가있다. 당신은 내 질문에 대답했다. 그러나 "나는 네이티브 C++에서 코드 모델을 10 배나 만들 수있다"고하지 않았습니다. 나는 희망했다. – user142350