Program Tip

.NET 리플렉션의 "비용"은 얼마입니까?

programtip 2020. 10. 30. 20:28
반응형

.NET 리플렉션의 "비용"은 얼마입니까?


중복 가능성 :
.NET 리플렉션 비용은 얼마나 듭니까?

나는 현재 반사가 나의 가장 친한 친구라는 프로그래밍 사고 방식에 있습니다. 엄격한 인터페이스보다는 "느슨한 구현"을 허용하는 콘텐츠의 동적 로딩과 많은 사용자 지정 속성에 많이 사용합니다.

리플렉션 사용에 대한 "실제"비용은 얼마입니까?

테이블 정의에 대한 모든 속성에 대한 자체 LINQ 이전 DAL 개체 코드와 같이 자주 반영되는 형식이 반영을 캐시하는 데 노력할 가치가 있습니까?

캐싱 메모리 풋 프린트가 리플렉션 CPU 사용을 능가합니까?


리플렉션을 사용하려면 많은 양의 형식 메타 데이터를로드 한 다음 처리해야합니다. 이로 인해 메모리 오버 헤드가 커지고 실행 속도가 느려질 수 있습니다. 이 기사 에 따르면 속성 수정은 약 2.5x-3x 느리고 메서드 호출은 3.5x-4x 느립니다.

다음은 리플렉션을 더 빠르게 만드는 방법과 오버 헤드가있는 위치를 설명하는 훌륭한 MSDN 기사 입니다. 더 배우고 싶다면 독서를 적극 권장합니다.

리플렉션이 코드에 추가 할 수있는 복잡성 요소로 인해 코드가 훨씬 더 혼란스럽고 작업하기가 어렵습니다. Scott Hanselman 과 같은 일부 사람들은 반사를 사용하여 해결하는 것보다 더 많은 문제를 만드는 경우가 많다고 믿습니다. 팀이 대부분 주니어 개발자 인 경우 특히 그렇습니다.

동적 동작이 많이 필요한 경우 DLR (Dynamic Language Runtime)을 살펴 보는 것이 좋습니다. .NET 4.0의 새로운 변경 사항으로 인해 일부를 솔루션에 통합 할 수 있는지 확인하고 싶을 수 있습니다. VB 및 C #의 동적 지원이 추가되어 동적 코드를 매우 우아하게 사용하고 사용자 고유의 동적 개체를 상당히 간단하게 만들 수 있습니다.

행운을 빕니다.

편집 : 나는 Scott의 사이트를 좀 더 파고 들었고이 팟 캐스트 를 반성했습니다. 나는 그것을 듣지 않았지만 그만한 가치가 있을지도 모른다.


반사 속도를 높이기 위해 할 수있는 일이 많이 있습니다. 예를 들어, 많은 속성 액세스를 수행하는 경우 HyperDescriptor 가 유용 할 수 있습니다.

메서드 호출을 많이 수행하는 경우 사용하여 형식화 된 대리자에 메서드를 캐시 할 수 있습니다. Delegate.CreateDelegate그러면 형식 검사 등을 한 번만 수행합니다 (중에 CreateDelegate).

많은 개체 생성을 수행하는 경우 Delegate.CreateDelegate도움이되지 않습니다 (생성자에서 사용할 수 없음)-그러나 (3.5에서) Expression이를 사용하여 다시 형식화 된 대리자로 컴파일 할 수 있습니다.

그렇습니다. 반사는 느리지 만 너무 많은 고통없이 최적화 할 수 있습니다.


큰 힘에는 큰 책임이 따른다.

당신이 말했듯이, 리플렉션은 그와 관련된 비용을 가지고 있으며 리플렉션을 얼마나 많이 수행 하느냐에 따라 애플리케이션 속도가 상당히 느려질 수 있습니다.

응용 프로그램의 크기에 따라 더 많은 이점이 있기 때문에 IoC (Inversion of Control)를 사용하는 데 가장 적합한 장소 중 하나입니다.


특히 Jr Devs의 좋은 링크와 훌륭한 의견에 감사드립니다.

우리에게는 주니어 개발자가이 작업을 수행하는 것이 더 쉽습니다.

[TableName("Table")]
public class SomeDal : BaseDal
{
    [FieldName("Field")]
    public string Field
}

DAL의 더 큰 의미보다는 이것은 DAL 개체의 구축 속도를 높이는 동시에 시니어 개발자의 내부 작업을 모두 숨 깁니다.

너무 나쁜 LINQ는 더 일찍 나오지 않았고, 때때로 우리가 그것의 절반을 썼다고 생각합니다.


리플렉션을 사용할 때 때때로 당신을 물릴 수있는 한 가지는 리팩토링을 할 때 리플렉션을 사용하여 호출을 업데이트하지 않는 것입니다. resharper와 같은 도구는 메서드 이름을 변경할 때 주석과 문자열을 업데이트하라는 메시지를 표시하므로 대부분의 경우 이러한 방식으로 파악할 수 있지만 동적으로 생성 된 메서드를 호출하거나 메서드 이름이 동적으로 생성 된 경우 뭔가 그리워.

유일한 해결책은 좋은 문서화와 철저한 단위 테스트입니다.

참고 URL : https://stackoverflow.com/questions/224232/what-is-the-cost-of-net-reflection

반응형