문제

나는 반사가 얼마나 나쁜지 끊임없이 듣는다.나는 일반적으로 반성을 피하고 그것 없이는 내 문제를 해결하는 것이 불가능한 상황을 거의 발견하지 못하지만 궁금했다 ...

애플리케이션에서 리플렉션을 사용한 사람들을 위해 성능 저하를 측정 했습니까? 정말 그렇게 나쁩니 까?

도움이 되었습니까?

해결책

맞습니다.그러나 그것은 당신이하려는 일에 달려 있습니다.

어셈블리 (플러그인)를 동적으로로드하기 위해 리플렉션을 사용하고 성능 "페널티"는 문제가되지 않습니다. 작업은 응용 프로그램 시작 중에 수행하는 작업이기 때문입니다.

그러나 각각에 대한 리플렉션 호출이있는 일련의 중첩 루프 내부를 리플렉션하는 경우 코드를 다시 방문해야합니다. :)

'몇 시간'작업의 경우 반영이 완벽하게 허용되며 지연이나 문제가 발생하지 않습니다.매우 강력한 메커니즘이며 .NET에서도 사용되기 때문에 시도하지 말아야하는 이유를 모르겠습니다.

다른 팁

그의 강연에서 일상적인 일의 성능 , Jeff Richter는 리플렉션으로 메서드를 호출하는 것이 정상적으로 호출하는 것보다 약 1000 배 느립니다 를 보여줍니다.

Jeff의 팁 : 메서드를 여러 번 호출해야하는 경우 리플렉션을 한 번 사용하여 찾은 다음 대리자 에 할당 한 다음 대리자를 호출합니다.

반사 성능은 구현에 따라 다릅니다 (반복 호출은 캐시되어야 함 (예 : entity.GetType().GetProperty("PropName"))). 매일 보는 리플렉션의 대부분은 데이터 판독기 또는 기타 저장소 유형 구조에서 엔티티를 채우는 데 사용되기 때문에 개체 속성을 가져 오거나 설정하는 데 사용할 때 리플렉션에 대한 성능을 벤치마킹하기로 결정했습니다.

모든 반복 호출을 캐시하고 실제 SetValue 또는 GetValue 호출을 시간 만 캐시하므로 공정하다고 생각되는 테스트를 고안했습니다. 성능 테스트를위한 모든 소스 코드는 https://bitbucket.org/grenade/accessortest. 면밀한 조사를 환영하며 권장합니다.

내가 내린 결론은 리플렉션 구현이 잘 수행 될 때 한 번에 100,000 개 미만의 행을 반환하는 데이터 액세스 레이어에서 리플렉션을 제거하는 것이 실용적이지 않고 눈에 띄는 성능 향상을 제공하지 않는다는 것입니다.

시간 그래프 (y) 채워진 엔티티 수 (x)

위의 그래프는 저의 작은 벤치 마크의 결과를 보여 주며, 반사 성능을 능가하는 메커니즘이 100,000 회주기 이후에만 눈에 띄게 수행된다는 것을 보여줍니다. 대부분의 DAL은 한 번에 수백 또는 수천 개의 행만 반환하며 이러한 수준에서 반영은 잘 수행됩니다.

루프 상태가 아니더라도 걱정하지 마세요.

가장 적절한 경험은 큰 개체 모델에서 속성별로 동일한 유형의 두 데이터 항목을 비교하는 코드를 작성하는 것이 었습니다.작동하고, 시도하고, 개처럼 달렸습니다.

나는 낙담했고, 하룻밤 사이에 논리를 변경하지 않고 동일한 알고리즘을 사용하여 비교를 수행하는 방법을 자동 생성 할 수 있지만 정적으로 속성에 액세스 할 수 있다는 것을 깨달았습니다.이 목적을 위해 코드를 적용하는 데 시간이 전혀 걸리지 않았고 객체 모델이 변경 될 때마다 버튼 클릭으로 업데이트 할 수있는 정적 코드와 엔티티를 속성별로 심층적으로 비교할 수있었습니다.

내 요점은 동료들과의 대화에서 리플렉션을 사용하는 것이 런타임 작업을 수행하는 대신 컴파일 할 코드를 자동 생성하는 것이 될 수 있다는 점을 여러 번 지적했기 때문에 고려할 가치가있는 경우가 많습니다.

대량은 아닙니다.Martin이 말했듯이 어리석은 위치에서 사용하지 않는 한 데스크탑 개발에서 문제가 없었습니다.많은 사람들이 데스크톱 개발 성능에 대해 완전히 비합리적인 두려움을 가지고 있다고 들었습니다.

컴팩트 프레임 워크 (일반적으로 사용)에서는 꽤 괜찮습니다.많은 아나 테마 가 많으며 대부분의 경우 전염병처럼 피해야합니다.나는 여전히 그것을 자주 사용하지 않을 수 있지만, 덜 재미있는 응용 프로그램에는 정말 조심해야합니다.: (

성능이 중요한 코드를 위해 .NET 라이브러리가 내부적으로 수행하는 리플렉션에 대해서도 걱정해야 할 정도로 나쁩니다.

다음 예는 더 이상 사용되지 않습니다. 당시 (2008 년) 사실이지만 오래 전에 최신 CLR 버전에서 수정되었습니다.하지만 일반적으로 반성은 여전히 다소 비용이 많이 듭니다!

사례 : 고성능 코드에서 lock (C #) / SyncLock (VB.NET) 문에서 "Object"로 선언 된 멤버를 사용해서는 안됩니다.왜?CLR은 값 형식을 잠글 수 없기 때문에 런타임 리플렉션 형식 검사를 수행하여 개체가 실제로 참조 형식이 아닌 값 형식인지 여부를 확인해야합니다.

프로그래밍의 모든 요소와 마찬가지로 성능 비용과 얻는 이점의 균형을 맞춰야합니다.반사는주의해서 사용할 때 매우 귀중한 도구입니다.바인딩을 수행하기 위해 리플렉션을 사용하는 C #에서 O / R 매핑 라이브러리를 만들었습니다.이것은 환상적으로 잘 작동했습니다.대부분의 리플렉션 코드는 한 번만 실행되었으므로 성능 저하는 거의 없었지만 이점은 컸습니다.새로운 fandangled 정렬 알고리즘을 작성하고 있다면 아마도 리플렉션을 사용하지 않을 것입니다.

여기에서 귀하의 질문에 정확하게 답변하지 못해 주셔서 감사합니다.내 요점은 그것이 실제로 중요하지 않다는 것입니다.적절한 경우 반사를 사용하십시오.사용 방법과시기를 배우는 데 필요한 또 다른 언어 기능입니다.

반사를 자주 개체 생성에 사용하면 성능에 눈에 띄는 영향을 미칠 수 있습니다. 복합 UI 애플리케이션을 기반으로 애플리케이션을 개발했습니다.반사에 크게 의존하는 블록 .리플렉션을 통한 개체 생성과 관련하여 눈에 띄는 성능 저하가있었습니다.

그러나 대부분의 경우 리플렉션 사용에는 문제가 없습니다.일부 어셈블리를 검사하는 것이 유일한 필요하다면 Mono.Cecil 을 추천합니다.href="http://codebetter.com/blogs/patricksmacchia/archive/2008/03/18/mono-cecil-vs-system-reflection.aspx"rel="nofollow noreferrer"> 가볍고 빠름

반영은 매개 변수 목록과 일치하는 메서드를 요청할 때마다 런타임에서 확인해야하는 많은 검사 때문에 비용이 많이 듭니다.내부 깊숙한 곳에는 유형의 모든 메소드를 반복하고, 가시성을 확인하고, 반환 유형을 확인하고, 각 매개 변수의 유형도 확인하는 코드가 있습니다.이 모든 작업에는 시간이 걸립니다.

이 메서드를 내부적으로 실행하면 실제 대상 메서드를 실행하기 전에 호환 가능한 매개 변수 목록을 통과했는지 확인하는 것과 같은 작업을 수행하는 코드가 있습니다.

가능하면 나중에 계속해서 재사용 할 경우 메소드 핸들을 캐시하는 것이 항상 권장됩니다.모든 좋은 프로그래밍 팁과 마찬가지로 자신을 반복하지 않는 것이 좋습니다.이 경우 특정 매개 변수를 사용하여 메소드를 지속적으로 조회 한 다음 매번 실행하는 것은 낭비입니다.

출처를 둘러보고 진행중인 작업을 살펴보세요.

모든 것과 마찬가지로 상황을 평가하는 것이 중요합니다. DotNetNuke 에는 리플렉션을 사용하여 데이터 행에서 개체를 채우는 FillObject라는 상당히 핵심 구성 요소가 있습니다.

이것은 매우 일반적인 시나리오이며 MSDN에 대한 기사가 있습니다. 성능 문제를 다루는 리플렉션을 사용하여 비즈니스 개체를 ASP.NET 양식 컨트롤에 바인딩

성능을 제쳐두고, 특정 시나리오에서 리플렉션을 사용하는 것에 대해 내가 싫어하는 한 가지는 코드를 한 눈에 이해하는 능력을 감소시키는 경향이 있다는 것입니다. 또한 강력한 형식의 데이터 세트 또는 LINQ to SQL 과는 달리 컴파일 시간 안전성을 잃습니다.

반사로 인해 앱 성능이 크게 저하되지는 않습니다.리플렉션을 사용하지 않으면 특정 작업을 더 빨리 수행 할 수 있지만 리플렉션이 일부 기능을 달성하는 가장 쉬운 방법이라면 사용하십시오.성능 문제가되는 경우 언제든지 Reflection에서 코드를 리팩터링 할 수 있습니다.

답은 상황에 따라 다르다는 것을 알게 될 것입니다.작업 목록 응용 프로그램에 넣으려는 경우 큰 문제가 아닙니다.페이스 북의 퍼시스턴스 라이브러리에 넣고 싶다면 큰 문제입니다.

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