2014-02-11 4 views
1

설정이 포함 된 싱글 톤 정적 클래스가 있습니다 (Settings.Instance.MemberName).
이 클래스는 여러 프로젝트가 포함 된 솔루션 내부의 GlobalSettings 프로젝트에 있습니다.정적 멤버 vs 정적 로컬 멤버 vs 로컬 멤버

모든 프로젝트가 DLL로 컴파일되어 외부 Windows 서비스 프로세스에서 사용됩니다.
이 솔루션의 한 프로젝트에서 나는 ClassA의 100-200 인스턴스를 가지며,이 클래스는 네트워크 소켓을 사용하여 장치에서 데이터를 폴링하는 데 사용됩니다.
폴링은 특정 로직으로 수행되며, 예를 들어 폴링 사이의 절전 시간은 Settings.Instance, 의 설정을 사용합니다.

socket.Send(..); 
Thread.Sleep(Settings.Instance.SleepBetweenSendAndReceive); 
socket.Receive(..); 

제 질문은 무엇을하는 것이 좋습니까?

  1. 모든 인스턴스는 위와 같이 직접 Settings.Instance.MaxNetworkRetries를 호출해야합니다. (Thread.sleep를 (_sleepBetweenSendAndReceive))를 ClassA의 생성자에서

  2. , 내가 로컬 정적 개인 회원

    모든 설정을로드해야합니다를 ClassA의 생성자에서

  3. 를, 내가해야 모든 설정을 로컬 전용 멤버에로드하십시오.

    (Thread.Sleep (_sleepBetweenSendA ndReceive))

은 무엇 최상의 성능을 줄 것이다? 아니면 전혀 차이가 없을 수도 있습니다.

+3

해당 코드와 관련된 성능 문제가 발생 했습니까? 그리고 아마도 더 중요한 질문 : 프로그램 실행 중에 'Settings.Instance.MemberName'값이 변경 될 가능성이 있습니까? – MarcinJuraszek

+0

그들은 변하지 않을 것입니다. 소켓을 사용하는 동안 성능 문제가 발생했습니다. 최선을 다해이 코드가 더 잘 작동하도록 만들었습니다. 이것이 사소한 향상이라고 생각합니다. 무엇보다 더 호기심이 많습니다. 교육 목적 또한 . – ilansch

답변

2

어쨌든 수행하려는 작업이 모두 Sleep() 인 경우 성능 문제가 있다고 상상할 수 없습니다.

네트워크 통신이 포함되면 네트워크가 일반적으로 병목 현상이 발생하며 속성 호출의 오버 헤드는 무시할 수 있습니다.

응용 프로그램의 성능을 향상 시키려면 Sleep()을 제거하고 Receive()을 차단하거나 비동기 적으로 데이터를 수신 할 수 있습니다 (데이터를 수신 할 것인지 확실하지 않은 경우).

하지만 결국 같은 클래스의 필드에 액세스하는 것은 정적 클래스의 속성보다 빠릅니다. 네트워크 통신없이 샘플 프로젝트를 작성하고 시간을 측정 할 수 있습니다.

+0

나는 적어도 그들 중 일부 네트워크 문제를 해결했다.이 질문은 내 클래스의 정적 멤버, 내 클래스의 개인 멤버 또는 동일한 프로세스에로드 된 다른 DLL의 정적 멤버를 호출하는 것에 관한 것입니다. – ilansch

+0

@ilansch 다른 클래스의 액세스하는 멤버가 같은 클래스의 일부 오버 헤드를 가졌지 만 다른 DLL의 것이면 상관 없습니다. 내가 아는 모두는 당신이 보통 성능 차이를주지 않을 것이라는 것입니다. 숫자를 원하면 벤치마킹하기 쉽습니다. –