문제

내 코드에서는 COM 인터페이스를 통해 레거시 델파이 객체를 인스턴스화하고 있습니다. 이 클래스는 여러 번 인스턴스화되어야하므로 인스턴스화의 오버 헤드를 낮추기 위해 모든 통화의 70%가 공통 결과 객체를 갖는 지점에서 캐시합니다.

그러나 캐시 된 후 물체를 변경하면 캐시에도 변경 사항이 지속됩니다. 이것은 COM 래퍼 인스턴스가 값 대신 참고 문헌에 의해 전달된다고 생각하게 만듭니다.
캐시의 객체가 ref에 의해 값으로 전달되는지 확인하려면 어떻게해야합니까?

도움이 되었습니까?

해결책

전혀 할 수 있다면 객체의 사본을 명시 적으로 복제 한 다음 사본을 캐시해야한다고 생각합니다. 예를 들어 참조하십시오 MemberwiseClone 방법과 다른 사람들은 답변에 언급되었습니다 C#의 복제 물체.

다른 팁

첫째, 이것이 필요합니까?

나는 "모든 성능 문제 해결 측정"의 옹호자는 아니지만 귀하의 경우에는해야합니다.

COM 객체를 인스턴스화하는 오버 헤드 (첫 번째 통화 페널티 이후)는 매우 낮습니다. 15 년 전 컴퓨터에서 많은 작은 개체를 제공하도록 설계되었음을 기억하십시오. .NET 오버 헤드가 훨씬 더 많지 않다고 가정하므로 질문은 객체 자체의 초기화입니다.

단단한 루프로 1000 개의 객체를 인스턴스화하여 쉽게 확인할 수 있습니다 (첫 번째 통화를 버리십시오. 매우 비싸고 평균을 망칠 수 있습니다).

COM 객체는 본질적으로 참조별로됩니다
기본 인터페이스는 인스턴스에 대한 참조 카운트 포인터이며 COM은 일반적인 "클론"메소드를 노출시키지 않기 때문에 COM 객체의 경우 "전달 값"이 없습니다.

가능한 해결책 : 복사기 작성
인스턴스화 인 경우에만 진짜 비싸고 대부분의 통화는 기본 인스턴스를 통해 수행 할 수 있으므로 복사기 쓰기 체계를 구현할 수 있습니다.

기본 인스턴스에 대한 참조를 보유한 래퍼 클래스와 0으로 초기화 된 개인 인스턴스에 대한 참조를 작성해야합니다.

개인 사례가있는 한 null, 모든 getter는 기본 인스턴스 인 Otherwis로 전달되며 개인 인스턴스로 전달됩니다.

모든 Setter/Mutator는 개인 인스턴스로 전진하여 존재하지 않을 때 생성합니다.

이것은 개인 인스턴스의 첫 번째 돌연변이 호출에 대한 생성을 지연시킵니다. 그러나이 구성 요소의 모든 관심있는 모든 인터페이스를 랩핑해야합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top