2017-10-23 10 views
-1

같이하여 인터페이스에 의한 성능 저하가된다
1)베이스 클래스 참조
성능면에서 더 참조

abstract class BaseClass{} 

class A : BaseClass{} 
class B : BaseClass{} 

static void Main(){ 
BaseClass objectInstance = new A(); 
      objectInstance = new B(); 
} 

또는
2 통해 객체 참조.) 인터페이스 참조를 통한 객체 참조 :

interface IBase{} 

class A : IBase{} 
class B : IBase{} 

static void Main(){ 
    IBase objectInstance = new A(); 
    objectInstance = new B(); 
} 
+4

이것은 당신 자신을 시험하기 쉽습니다. 간단한 질문을 실행하는 것보다이 질문을 올바르게 작성하고 형식을 지정하는 데 더 많은 시간이 걸렸을 것입니다. –

+1

[어느 쪽이 더 빠릅니까?] (https://ericlippert.com/2012/12/17/performance-rant/) –

+2

이 코드에는 아무런 영향이 없습니다. 중요한 것은 다음에 수행하는 작업입니다. 인터페이스 메소드 호출에는 약간의 오버 헤드가 있습니다. 호출 스텁을 통과해야하며 지터 최적화 프로그램은 메소드를 인라인 할 수 없습니다. 퍼프 차이는 정확하게 측정하기가 어렵고, 비 인터페이스 방식을 완전히 사라지게함으로써 벤치 마크를 엉망으로 만드는 것은 매우 빠르며 코드가 매우 쉽습니다. 인터페이스는 구조적인 디자인 패턴입니다. 여러분은 그것들에 동의하지도 않고 임의로 던져 버릴 수도 없습니다. 매우 무겁게 CLR에 의해 마이크로 최적화 된 그들은 빨지 않습니다. –

답변

-1

영향은 현미경 적이며 코드의 실제 성능에 중요한 부분을 작성할 때까지 사용자는주의를 기울이지 않고 사용자의 요구에 가장 적합한 것을 사용하지 못할 수 있습니다.

그러나 인터페이스에 성능 문제가 발생할 수있는 경우가 있습니다. 인터페이스를 매개 변수로 받아들이고 인터페이스를 구현하는 구조체가있을 때 발생합니다.

class Demo { 
    public static void Method(IInterface input) {}; 
} 

struct Struct: IInterface {} 


Demo.Method(new Struct(arg1, arg2)) 

이러한 코드는 구조체의 복싱을 유발합니다. 당신은 시간/속도 성능 문제가있을 수 있습니다 권투에게

class Demo { 
    public static void Method<T>(T input) where T: IInterface {}; 
} 
0

을 방지하기 위해 제약 제네릭 사용을 고려해야하지만 개봉 된 작은 컬렉션을 작업하는 경우의 차이는 무시할 수있다. 매개 변수로 목록을 사용하면 대신 iList를 사용합니다. 당신에게 달려 있습니다. 여기에 참고 자료가 있습니다 ... https://github.com/dotnet/coreclr/issues/9105