문제

다음과 같이 선언된 특정 메서드 매개 변수가 있는 C# 인터페이스가 있습니다. object 유형.그러나 전달되는 실제 유형은 인터페이스를 구현하는 클래스에 따라 다를 수 있습니다.

public interface IMyInterface
{
    void MyMethod(object arg);
}

public class MyClass1 : IMyInterface
{
    public void MyMethod(object arg)
    {
        MyObject obj = (MyObject) arg;
        // do something with obj...
    }
}

public class MyClass2 : IMyInterface
{
    public void MyMethod(object arg)
    {
        byte[] obj = (byte[]) arg;
        // do something with obj...
    }
}

MyClass2의 문제점은 byte[] 에서 그리고 에서 object ~이다 복싱과 언박싱, 이는 성능에 영향을 미치는 계산 비용이 많이 드는 작업입니다.

이 문제를 다음과 같이 해결하시겠습니까? 일반 인터페이스 복싱/언박싱을 피하시나요?

public interface IMyInterface<T>
{
    void MyMethod(T arg);
}

public class MyClass1 : IMyInterface<MyObject>
{
    public void MyMethod(MyObject arg)
    {
        // typecast no longer necessary
        //MyObject obj = (MyObject) arg;
        // do something with arg...
    }
}

public class MyClass2 : IMyInterface<byte[]>
{
    public void MyMethod(byte[] arg)
    {
        // typecast no longer necessary
        //byte[] obj = (byte[]) arg;
        // do something with arg...
    }
}

.NET과 Mono에서는 어떻게 구현됩니까?두 플랫폼 모두 성능에 영향을 미치나요?

감사합니다!

도움이 되었습니까?

해결책

모노에서 어떻게 구현되는지 잘 모르겠지만, 일반적인 인터페이스는 컴파일러가 사용되는 각각의 다른 유형에 대해 특정 유형의 새로운 기능을 생성하기 때문에 도움이 될 것입니다 (내부적으로 동일한 생성 된 기능을 활용할 수있는 몇 가지 경우가 있습니다). . 특정 유형의 함수가 생성되면 유형을 상자/UNBOX를 발사 할 필요가 없습니다.

컬렉션은 컬렉션이 이유입니다. Generic Library는 .NET 2.0에서 큰 타격을 입었습니다. 컬렉션은 더 이상 권투가 필요하지 않고 훨씬 더 효율적이 되었기 때문입니다.

다른 팁

.NET에서하는 모노에서 동일한 혜택을 얻을 수 있습니다.

제네릭은 1.9로만 성숙해지기 때문에 일반적으로 Mono 1.9 또는 Mono 2.0 RCX를 사용하는 것이 좋습니다.

MyClass2의 문제점은 바이트 []를 객체로 전환하는 것이 권투 및 Unboxing으로 변환되며, 이는 성능에 영향을 미치는 계산적으로 비싼 작업입니다.

배열 유형과 관련된 권투는 없으며 값 유형 요소가있는 것도 없습니다. 배열은 참조 유형입니다.

(Byte []) arg의 오버 헤드는 최소입니다.

예, .Net(MS는 모노에 대해 잘 모르겠습니다)에서는 제네릭이 컴파일 타임에 구현되므로 박싱이나 언박싱이 전혀 진행되지 않습니다.백그라운드에서 캐스트를 수행하는 구문 설탕인 Java 제네릭과 대조됩니다(적어도 한 번은 이런 식이었습니다).제네릭의 주요 문제점은 제네릭 컨테이너를 다형성으로 처리할 수 없다는 것입니다. 하지만 이는 주제에서 약간 벗어났습니다. :-)

나는 모노와 대화 할 수 없지만 일반 인터페이스를 사용합니다. ~해야 한다 MS 런타임에서 권투/미확가 부스 문제를 해결하십시오.

최근에 Mono의 최근 버전을 사용하고 있습니다. 가능하면 2.0입니다.

모노의 일반 인터페이스 성능은 일반 인터페이스 디스패치와 쌍을 이루고 있습니다.

일반 가상 방법의 파견 [1]은 모든 릴리스 버전의 모노에서 끔찍하며 1.9에서 개선되었습니다.

일반 가상 방법의 성능 문제가 올해 말까지 예정된 Mono (2.2)의 다음 릴리스에 대해 고정되어 문제가 나쁘지 않습니다.

1] 일반적인 가상 방법은 다음과 같습니다.

공개 인터페이스 foo {

  void Bla<T> (T a, T b);

}

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