2009-11-26 2 views
16

이 방법은 더 빠르기 때문에 PropertyInfo.GetValue/SetValue 대신 Reflection.Emit을 사용해야한다고 들었습니다. 하지만 실제로 Reflection.Emit에서 무엇이 있는지 모르며 GetValue 및 SetValue를 대체하는 데이 메서드를 사용하는 방법을 설명합니다. 아무도 이걸 도와 줄 수 있니?Reflection.Emit GetValue 및 SetValue보다 좋음 : S

+2

어? Reflection.Emit을 사용하면 나중에 실행할 수 있도록 코드를 작성할 수 있습니다. 그러나 디버깅하기는 어렵지 않고 복잡하고 오류가 발생하기 쉽습니다.GetValue/SetValue를 사용하여 수행하려는 작업과 필요한 성능 요구 사항을 설명해야합니다. 리플렉션을 처음 사용하는 이유는 무엇입니까? –

+1

그는 동적으로로드 된 객체를 가지고 있으며 속성에 액세스하려고합니다. GetValue/SetValue 또는 * "hard-coded"속성에 액세스하기 위해 IL 코드를 생성하는지 *에 대한 질문이 더 좋습니다. Reflection.Emit.DynamicMethod로 시도한 다음 어느 것이 더 빠른 지 확인하는 것이 좋습니다. 나를 위해, GetValue/SetValue 충분했다, 난 그냥 컴파일 타임에 알 수없는 서명 이벤트를 처리하기위한 일리노이 코드를 생성 할 필요가 :) – OregonGhost

+0

개체의 속성 값 가져 오기 및 설정 사용자 반성 (나는 유형을 모르지만) – Omu

답변

26

그냥 다른 대답입니다. 성능은 원하지만 비슷한 API 일 경우 - 고려하십시오 HyperDescriptor; 이 (그래서 당신은 필요가 없습니다) 아래 Reflection.Emit를 사용하지만, 당신은 그냥 사용할 수 있도록 PropertyDescriptor API에 자신을 노출 : 코드의

PropertyDescriptorCollection props = TypeDescriptor.GetProperties(obj); 
props["Name"].SetValue(obj, "Fred"); 
DateTime dob = (DateTime)props["DateOfBirth"].GetValue(obj); 

한 줄이 그것을 가능하게, 모든 캐싱 등을 처리

+0

"다운로드 할 때마다 HyperDescriptor를 사용 하시겠습니까? "? 난 그저 속성을 가져 와서 값을 설정해야한다. 그게 전부다. – Omu

+0

나는 codeproject에서 HyperDescriptor 컴포넌트를 다운로드하고 페이지에 표시된대로 (여러 가지 방법으로) 사용할 수 있어야한다. * HyperDescriptor가 없으면 이것은 영광스러운 반사입니다. HyperDescriptor는 TypeDescriptor를 가로 채고 리플렉션 코드를 동적 IL로 바꿉니다. –

+1

혼란 스럽습니다. 동일한 코드가 HyperDescriptor의 유무에 관계없이 잘 작동하지만,/much/(~ 100x) 느리지 만. 문제가 발생하면 알려주세요 (몇 년 전에 작성했지만 대부분 기억하고 있습니다!) –

1

Reflection.Emit의 목적은 PropertyInfo.Get/SetValue의 목적과 완전히 다릅니다. Reflection.Emit을 통해 직접 동적으로 컴파일 된 어셈블리에 IL 코드를 직접 내보내고이 코드를 실행할 수 있습니다. 물론,이 코드는 사용자의 속성에 액세스 할 수 있습니다.

나는 이것이 결국 PropertyInfo를 사용하는 것이 훨씬 빠르다는 것을 진지하게 의심하고 있으며,이 목적을 위해서도 만들어지지 않았습니다. 예를 들어, 작은 컴파일러의 코드 생성기로 Reflection.Emit을 사용할 수 있습니다.

1

Reflection.Emit을 사용하면 조금이라도 "똑똑한"것처럼 보일뿐 아니라 조기 최적화가됩니다. 당신이 당신의 응용 프로그램을 프로파일 링하고는 GetValue/SetValue는 반사가 병목입니다 찾기 경우에, 당신은 최적화를 고려해야 할 수도 있지만 아마 그렇다하더라도 ...

11

사용 PropertyInfo.GetValue/SetValue를

이있는 경우 그리고 경우에만 - - 성능 문제는 (반복 GetProperty를 호출하지 않습니다)

만약 PropertyInfo 오브젝트를 캐시 반사의 사용이

Delegate.CreateDelegate

(프로파일 러에서와 같이) 귀하의 응용 프로그램의 성능 병목 사용 만약 정말로 - 정말로 정말로 - 당신은 절대적으로 읽기/쓰기 t 그는 여전히 런타임에서 IL을 생성하는 재미있는 세계에 대해 배우기 시작할 때가 가장 나쁜 병목입니다.

나는 그럴 가치가 있다고 생각합니다. 각 레벨은 코드의 복잡성을 증가시켜 성능을 향상시킵니다.

런타임에 속성에 액세스 할 때 성능 병목 현상이 발생하는 경우 컴파일 시간에 액세스하는 것이 더 좋습니다 (동시에 일반 및 초 고성능을 처리하는 것이 어려울 수 있습니다).

+0

하지만 doable : http : // www. codeproject.com/KB/cs/HyperPropertyDescriptor.aspx –

22

동일한 속성을 여러 번 가져 오거나 설정하는 경우 형식을 사용하는 메서드를 만들기 위해 무언가를 사용하면 실제로 리플렉션보다 빠릅니다. 그러나 Reflection.Emit 대신 Delegate.CreateDelegate을 사용하는 것이 좋습니다. 옳다는 것이 더 쉽고, 여전히 우스꽝스럽게 빠릅니다.

저는 이것을 프로토콜 버퍼 구현에 사용했으며 상당한 차이가있었습니다 (PropertyInfo.GetValue/SetValue). 다른 사람들이 말했듯이, 가장 간단한 방법이 너무 느리다는 것을 증명 한 후에 만 ​​이것을하십시오.

CreateDelegate 경로를 선택하기로 결정한 경우 자세한 내용은 blog post입니다.

+0

매우 흥미 롭습니다 - FieldInfo.SetValue에 대한 대리자를 만들려고했는데 아무 것도 변경하지 않았습니다. 상당히 분명하게, 왜냐하면 내가 한 것은 함수가 호출되는 방식을 바꾸는 것이었고, 느린 함수 자체이기 때문입니다. 이렇게 성능이 어떻게 향상 되었습니까? 나는 블로그 포스트에서 정보를 찾지 못했다. (어쩌면 나는 단지 눈이 멀었다 :-D) – Steffen

+0

블로그 항목을 다시 읽고 GetGetMethod와 GetSetMethod 부분을 발견했다. 어쨌든 이것은 FieldInfos의 속도 차이를 분명히 설명합니다. -S 그러나 저는 Marcs 예제를 기대합니다 :-) 당신이 한 일을 발견했음을 알리고 싶었습니다. 대리인을 통해 사물을 빠르게 할 수 있습니다. – Steffen

+1

건배 (+1) - 방금 채워진 클래스에 페이지 당 .1s - .8s를 저장하는 아이디어를 사용했습니다 :-) – Keith

관련 문제