먼저 필요한가?
"모든 성능 문제를 해결하는 방법"을지지하는 사람은 아니지만, 귀하는해야합니다.
COM 개체를 인스턴스화하는 오버 헤드는 매우 낮습니다. 즉, 15 년 전의 컴퓨터에서 많은 작은 개체를 사용할 수 있도록 설계되었습니다. 나는 .NET 오버 헤드가 훨씬 더 많지 않다고 가정한다. 그래서 질문은 객체 자체의 초기화이다.
당신이 꽉 루프에서 1,000 개체를 인스턴스화 것을 쉽게 확인할 수 있습니다
COM 개체를
가 참조 본질적이다 (첫 번째 통화를 던져, 그것은 매우 비쌀 수와 평균을 망칠 것) 기본 인터페이스는 인스턴스에 대한 참조 카운트 된 포인터이고 COM은 일반적인 "복제"메서드를 노출하지 않으므로 COM 개체에 대해서는 "값으로 전달"하지 않습니다.
가능한 솔루션 : 기록 중 복사 인스턴스화 정말 비용, 그리고 통화의 대부분이 기본 인스턴스를 통해 수행 할 수 있습니다 경우에만
을, 당신은 기록 중 복사 방식을 구현할 수 있습니다 .
당신은 기본 인스턴스에 대한 참조를 유지하는 래퍼 클래스를 작성해야하고, 개인 인스턴스에 대한 참조는 0으로 초기화
만큼 민간 인스턴스가 null
의에 앞으로 모든 게터 기능을 그대로 기본 인스턴스, otherwis, 그들은 개인 인스턴스로 전달합니다.
모든 setter/mutator 호출은 개인 인스턴스로 전달하여 존재하지 않을 때 생성합니다.
이렇게하면 개인 인스턴스의 생성이 첫 번째 변경 전화로 지연됩니다. 그러나이 구성 요소에 대해 관심있는 모든 모든 인터페이스를 래핑해야합니다.
"개체"를 변경한다고 쓰면 Delphi COM 개체 또는 RCW .NET 측 랩핑 프록시를 참조합니까? 물론 COM 객체는 항상 참조로 전달되므로 캐시하면 상태에 대한 변경 사항을 공유해야합니다 ... 아마도 간단한 예가 귀하의 질문을 명확하게 해줍니다. –
이후의 변경은 프록시 클래스에서 수행됩니다. 예제를 추가하겠습니다.하지만 기존의 오브젝트를 사용하는 코드는 평소와 같이 지저분합니다. –