2017-02-21 7 views
0

Lazy<T> 속성 캐싱을 사용하는 경우 배킹 필드가 있거나 배킹 필드가없는 속성에 액세스 할 때 동작간에 차이가 있습니까? 아마도 어떤 연주가 들리는가?게으른 <T> 캐싱 백킹 필드 /없이 - 성능?

아래 예제 코드는 내부 속성에 Autofac IoC container을 캐싱합니다. 이 코드는 한 번만 초기화 할 수 있습니다. 그것이 올바른 IoC/DI 원칙을 따르 든 따르지 않는 것이 문제는 아닙니다.

예 1 :

internal static ILifetimeScope Bootstrap = new Lazy<ILifetimeScope>(InitializeContainer, LazyThreadSafetyMode.ExecutionAndPublication).Value; 

private static ILifetimeScope InitializeContainer() 
{ 
    ContainerBuilder builder = new ContainerBuilder(); 
    //Registration logic... 
    return builder.Build(); 
} 

예 2 :

private static readonly Lazy<ILifetimeScope> _container = new Lazy<ILifetimeScope>(InitializeContainer, LazyThreadSafetyMode.ExecutionAndPublication); 

internal static ILifetimeScope Container => _container.Value; 

private static ILifetimeScope InitializeContainer() 
{ 
    ContainerBuilder builder = new ContainerBuilder(); 
    //Registration logic... 
    return builder.Build(); 
} 

편집 한 내가 있도록 용기의 캐시 값을 갖는에 주로 관심이 속성에 액세스 할 때마다 초기화되지 않습니다. 초기화가 지연되는지는 상관하지 않습니다.

+0

"올바른 IoC/DI 원칙을 따르 든 따르지 않는 것은 문제가 아닙니다." 의문의 여지가 없지만 언제나 의문의 여지가있는 것. – Steven

+0

별로. 두 예제 모두에서 속성에 액세스를 시도했으며 초기화 팩토리를 한 번만 실행하고 있는지 확인했습니다. 많은 'Lazy '캐싱 예제가 뒷받침 필드와 함께 표시되며, 첫 번째 예제가 더 예쁘다고 생각하기 때문에 이유가 궁금합니다. 예 : http://stackoverflow.com/questions/5134786/cached-property-vs-lazyt?rq=1 –

+1

첫 번째 것은 대부분 'Bootstrap = InitializeContainer();'를 작성하는 것과 동일합니다. 포함하는 클래스의 정적 생성자가 실행될 때만 초기화를 컨테이너에 액세스하는 시간에 위임하지 않습니다. 이 경우에는'게으른'을 사용하는 것이 거의 없습니다. – Luaan

답변

1

첫 번째 예제에서는 IMO가 그 행의 .Value를 사용하면 게으른 객체가 인스턴스화 된 바로 다음에 컨테이너를 인스턴스화하기 때문에 Lazy를 거의 쓸모 없게 만든다. 개체의 시간은 나중에 지연되지 않습니다.

개체의 생성을 지연해야한다면 Container가 호출 될 때까지 컨테이너가 초기화되지 않기 때문에 두 번째 예제가 더 좋습니다.

또 다른 예는 .Value를 사용하지 않는 필드 일 것이므로 두 번째 예제와 동일하지만 어디에서나 .Value를 호출해야하므로 약간의 불편 함이 있습니다. 나는 당신의 위치에 있다면

internal static Lazy<ILifetimeScope> Bootstrap = new Lazy<ILifestimeScope>(InitializeContainer, LazyThreadSafetyMode.ExecutionAndPublication);

그래서 모두 편안하게 통화하는 두 번째 예를 들어 가서 유용 게으른 로딩을 만들지 만, 처음으로 컨테이너를 너무 초기화됩니다 호출하는 것을 기억 것 처음 사용하는 경우 첫 번째 예제보다 약간 시간이 걸릴 것입니다.

+0

저는 주로 캐시 된 값을 갖고 생성을 지연시키지 않는 것에 관심이 있습니다. –

+0

그렇다면 거의 같지만, 컨테이너가 쓰레드에 안전해야 하는지를 평가할 것입니다.그렇다면 Lazy를 사용하고, 그렇지 않다면 정적 생성자를 사용할 수 있습니다. Lazy는 고정 ctor에 약간의 오버 헤드가 있지만 올바르게 구성된 경우 스레드 안전을 보장합니다. 그리고 두 가지 예에서 나는 둘 중 하나를 사용했을 때의 성능에 큰 타격이 없다고 생각합니다. – fmaccaroni