は、その静的なメンバーがタイプに特異的である、ジェネリック型を作成します。:例えば、含む型に型注釈を伝播する必要があります。 Resharper(C#用)は警告を出しますが、ここに本当に必要なものがあります。
と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'で置き換えてください。 –
私は、通常のジェネリックを使用する例を編集しました。しかしながら、問題は依然として残っている。 – jackmott
ジェネリックパラメータの生成元を指定してください。 'LeftoverPool < 'T>' –