업데이트 : 예상 했어야 할 것처럼이 질문에 대한 커뮤니티의 건전한 조언은 "측정하여보고"하는 것이 었습니다. chibacity posted an answer 나를 위해 이렇게 좋은 테스트가 있습니다. 한편, 나는 내 자신의 시험을 썼다. 내가 본 성능 차이는 실제로 I felt compelled to write a blog post about it.ThreadStatic을 사용하여 값 비싼 지역을 대체하는 것이 좋습니다.
그러나, 나는 또한 ThreadStatic
속성이 참으로 무료로하지 않습니다 실제로 마법을 작동하기 위해 CLR 도우미 방법에 의존하는 Hans's explanation을 인정해야 너무 거대했다. 이것은 임의의 경우에 적용하는 것이 적절한 최적화인지 여부를 명확히하지 않습니다.
내게 좋은 소식은 내 경우에 큰 개선을 한 것으로 보입니다.
나는 (많은 다른 것들 사이에) 몇 지역 변수에 대한 몇 가지 중간 크기의 배열 (~ 50 요소)를 인스턴스화하는 방법이있다.
필자는이 방법을 성능 병목 현상으로 확인했습니다. 이 방법이 전화하는 데 오랜 시간이 걸리는 것은 아닙니다. 오히려 간단히 번, 매우 신속하게 (몇 시간이 될 수있는 세션에서 수십만에서 수백만 번) 호출됩니다. 따라서 상대적으로 작은 성능 개선만으로도 가치가 있어야합니다.
각 호출마다 새 배열을 할당하는 대신 [ThreadStatic]
으로 표시된 필드를 사용할 수있었습니다. 메소드가 호출 될 때마다 현재 스레드에서 필드가 초기화되었는지 확인하고 그렇지 않으면 초기화합니다. 그 시점에서 같은 스레드에 대한 모든 호출에 그 시점에 갈 준비가 된 배열이 생깁니다. 이것은 좋은 생각 같지 않습니다
는
내 질문은 단순히 이것이다. (이 방법은 배열 자체의 모든 요소를, 그래서 문제가되지해야 배열의 "오래된"요소를 갖는 초기화)? 이런 방식으로 ThreadStatic
속성을 사용하는 데있어주의해야 할 사항 (즉, 로컬 변수에 대한 새 객체를 인스턴스화하는 비용을 줄이기위한 성능 최적화)에 대해 알아야 할 사항이 있습니까? ThreadStatic
필드 자체의 성능이 좋지 않을 수도 있습니다. 예를 들어,이 기능을 사용 가능하게 만들기 위해 백그라운드에서 비용이 많이 드는 추가 "물건"이 많이 있습니까? 그 때문에 만약
그것은 심지어 50 요소로 싼 뭔가 (?) 최적화하기 위해 시도 할 틀렸다 나에게도 꽤 그럴듯의 배열을-하고, 확실히 알려-하지만하자 일반 질문 여전히 보유.
시도해보십시오. thread-local 항목에 액세스하는 것은 무료가 아니지만 재 할당보다 비용이 적게 듭니다. – 9000
시도해보고 측정하십시오. – BRampersad
.NET4를 사용할 수 있다면 ['ThreadLocal'] (http://msdn.microsoft.com/en-us/library/dd642243.aspx)도 잊지 마십시오. 배심원 단은 여전히'ThreadStatic'보다 성능이 좋았는지에 관해서는 나왔지만 사용하기가 쉽습니다. 'ThreadLocal '을 고려하여 벤치 마크에 포함시키는 것이 좋습니다. –
LukeH