는 정적 구성원 유형에 대한 구체적인 것, 제네릭 형식을 만들기 : 예컨대, 포함하는 유형으로 유형 주석을 전파해야합니다. Resharper (C# 용)는 경고를 표시하지만 실제로 필요한 것은 여기에 있습니다.
또한 ThreadStatic
대 ThreadLocal
까지 벤치 마크해야합니다. 나중에는 사실 개체 풀이며 각 스레드의 특수 메모리 영역에있는 스레드 정적 필드와 비교할 때 조회 오버 헤드가 있습니다.
업데이트
어쨌든 잠시 동안 테스트려고, 여기에 코드와 출력됩니다. ThreadStatic은 더 빠릅니다.
[TestFixture]
public class BuffersTests {
public static class LocalBuffers<T> {
[ThreadStatic]
private static T[] _threadStatic;
private static ThreadLocal<T[]> _threadLocal = new ThreadLocal<T[]>(() => new T[10]);
public static T[] ThreadStatic => _threadStatic ?? (_threadStatic = new T[10]);
public static T[] ThreadLocal => _threadLocal.Value;
}
[Test, Ignore]
public void ThreadStaticVsThreadLocal() {
for (int r = 0; r < 10; r++) {
const int count = 100000000;
var sw = new Stopwatch();
sw.Restart();
var sum = 0L;
for (var i = 0; i < count; i++) {
var buffer = LocalBuffers<int>.ThreadStatic;
buffer[0] = 123;
sum += buffer[0] + buffer[1];
}
Assert.IsTrue(sum > 0);
sw.Stop();
Console.WriteLine($"ThreadStatic {sw.ElapsedMilliseconds}");
sw.Restart();
sum = 0L;
for (var i = 0; i < count; i++) {
var buffer = LocalBuffers<int>.ThreadLocal;
buffer[0] = 123;
sum += buffer[0] + buffer[1];
}
Assert.IsTrue(sum > 0);
sw.Stop();
Console.WriteLine($"ThreadLocal {sw.ElapsedMilliseconds}");
Console.WriteLine("---------------------");
}
}
}
ThreadStatic 1286
ThreadLocal 1860
---------------------
ThreadStatic 1312
ThreadLocal 1849
---------------------
ThreadStatic 1334
ThreadLocal 1933
---------------------
ThreadStatic 1390
ThreadLocal 2076
---------------------
ThreadStatic 1438
ThreadLocal 2088
---------------------
ThreadStatic 1295
ThreadLocal 2216
---------------------
ThreadStatic 1317
ThreadLocal 1972
---------------------
ThreadStatic 1380
ThreadLocal 1943
---------------------
ThreadStatic 1410
ThreadLocal 1970
---------------------
정적으로 해결 된 제네릭을 사용하고 있습니다. 대신 일반^T ^를''T '로 바꾸십시오. –
정규 generics 사용 예제를 편집했습니다. 그러나 문제는 여전히 남아 있습니다. – jackmott
제네릭 매개 변수의 출처를 지정하십시오. 'LeftoverPool < 'T>' –