반사 : 반사 사용이 여전히 "나쁜"또는 "느린"입니까? 2002 년 이후로 반성에 무엇이 바뀌 었습니까?


21

Expressions 또는 Expression Trees를 다룰 때 리플렉션을 많이 사용하여 속성 값을 설정하고 가져 오는 것을 알았습니다. 리플렉션 사용이 점점 더 일반화되고있는 것 같습니다. 유효성 검사를위한 DataAnotations, Attribute Heavy ORM 등 .

그렇다면 무엇이 바뀌 었습니까? 기계의 속도일까요? 반영 속도를 높이기 위해 프레임 워크가 변경 되었습니까?

아니면 아무것도 바뀌지 않았습니까? 여전히 반사를 사용하는 것이 "나쁜"또는 "느린"입니까?


2
전화를 거는 것이 있는지 확인하고 확인하려면 여러 단계를 수행해야하기 때문에 리플렉션은 항상 직통 전화보다 느립니다.
Michael K

그것은 항상 나빴다. ... 물론 때로는 선택의 여지가 없다. 프로그래머가 그시기를 알기 위해 달리 선택하지 말아야한다.
Ramhound

열거 형에서 하나의 항목을 가져 오기 위해 gettype을 사용하여 리플렉션을 수행하는 것이 Enum.Parse ()로 예외를 던지는 것보다 여전히 30 배 이상 빠릅니다. 그래서 반사가 때때로 이깁니다.
Brain2000

답변:


16

반성이 나쁘지도 느리지도 않습니다. 단순히 도구입니다. 모든 도구와 마찬가지로 특정 시나리오에서는 매우 유용하지만 다른 시나리오에서는 그렇게 중요하지 않습니다.

성능이 실제로 문제인 경우 항상 FasterFlect 와 같은 라이브러리를 사용할 수 있습니다 .

추가 자료
반성이 비효율적이라면 언제 가장 적절합니까?


또는 dynamic-분명히 반사보다 훨씬 빠릅니다.
오디드

1
성능은 전혀 문제가되지 않습니다. 2002 년 재앙을 피하는 사람들이 역병처럼 생생하게 기억합니다. 그 이후로 무엇이 바뀌 었는지 궁금합니다.
blesh

3
@blesh : 아무것도 없습니다. 사람들은 지금 그것에 대해 더 잘 알고 있으며 두려워하지 않습니다.
Robert Harvey

5
나는 모두 "나의 잔디밭에서 내릴"수 있고 리스프가 OOP가 존재 하기 훨씬 전에 이것을 가지고 있다고 말할 수있다 .
Michael K

충분합니다. 지난 10 년 동안 기계가 속도를 향상시켜 차이를 만들어 냈는지 또는 실제로 성능을 향상시킨 System.Reflection이 변경되었는지 궁금합니다.
blesh

17

사람들이 불필요하게 반사를 사용하는 것에주의하는 이유는 성능이 아니기 때문입니다. 예, 반사를 사용하는 데 약간의 오버 헤드가 있지만 종종 비슷한 복잡성을 가진 다른 접근 방식을 사용하지 않고 문제를 해결해야하며, 그렇지 않은 경우에도 오버 헤드는 거의 중요하지 않습니다 (특히 응용 프로그램 수준 개발의 경우).

리플렉션을 사용하면 소스 코드에 대해 일반적으로 할 수있는 몇 가지 중요한 가정이 깨지고 "모든 참조 찾기"와 같은 도구가 안정적으로 작동하지 않습니다. 리플렉션 (Reflection)은 기본적으로 컴파일러가 시행하는 C #과 같은 대부분의 유형 안전과 유형 시스템이 일반적으로 컴파일러 오류로 잡아서 변환하는 프로그래밍 오류의 대부분을 제거하여 최악의 경우 런타임 오류가되거나 매우 불명확 한 버그가됩니다.

그렇다면 사람들은 왜 반사를 사용합니까? 간단히 말하면 위에서 설명한 문제에도 불구하고 매우 귀중한 도구이기 때문입니다. 리플렉션을 통해 동적 프로그래밍의 이점 중 일부는 C #과 같이 정적이고 엄격하게 유형이 지정된 언어로 제공 될 수 있으며 동적 프로그래밍 언어는 최근 특히 웹 프로그래밍 영역 (PHP, Javascript 및 상당히 두드러진 Python)에서 그 장점을 보여주었습니다. 모두 동적 타이핑을 사용하며 웹 프로그래밍에 적합한 것으로 입증되었습니다. 그러나 언어는 여전히 C #이므로 대부분의 응용 프로그램을 엄격하게 형식이 지정된 OOP 관용구로 유지하고 동적 동작이 실제로 리플렉션과 다른 부분을 작게 작성할 수 있습니다.

일반적인 예는 메서드를 웹 서비스 호출로 노출해야하는 경우입니다 (아직 .NET에 내장되지 않은 프로토콜 사용). 엄격하게 형식화 된 OOP 접근 방식은 작동하지만 지나치게 제한적이고 어색합니다. 그러나 리플렉션을 사용하여 메서드에 대한 호출과 키 / 값 쌍을 인수에 매핑하면 해당 웹 서비스에 대한 배관을 한 번 작성한 다음 원하는 클래스에서 사용할 수 있습니다.


13

리플렉션은 여전히 ​​직통 전화보다 훨씬 느립니다. 두 가지가 변경되었습니다.

  • 런타임은 반사 메커니즘을 최적화하여 차이가 작아졌습니다.
  • CPU가 더 빨라져서 작은 비 효율성이 더 쉽게 견딜 수 있습니다.

이 두 가지 요소가 함께 반영 비용이 일상적으로 (유지 보수성 POV에서 적절한 경우)이를 사용할 수있는 지점으로 낮추고 프로파일 러가 실제로 병목 현상인지 여부를 알려줄 때까지 기다립니다 ( 그렇지 않을 시간).


4
아쉽게도 CPU는 일반적으로 모바일 장치와 사람들이 실행 비용으로 인해 서버에서 최대한 많은 효율성을 얻으려고하는 서버에서 느려졌습니다.
gbjbaanb

@ gbjbaanb : 모바일 장치를 제공하지만 서버에서 코드를 최적화하는 대신 더 많은 하드웨어를 구입하는 것이 서버 구매 및 운영 비용이 훨씬 저렴하기 때문에 대부분의 경우 받아 들여지고 합리적인 선택입니다. 코드 최적화 비용.
Michael Borgwardt

2
어떤 상황에서는 서버 비용이 개발 비용보다 크게 뛰어납니다. 대규모 확장 스타일. 서버가 버프하더라도 클라이언트 시스템보다 성능이 훨씬 중요 할 수 있습니다. 사례 별 시나리오입니다.
타이 두스 군주

1
@Lord Tydus : 물론, 설명하는 경우는 드문 예외입니다.
Michael Borgwardt
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.