Создание универсального типа, то его статические члены будут специфичными для данного типа. Resharper (для C#) выдает предупреждение, но вот что вам действительно нужно.
Кроме того, вы должны бенчмарка ThreadStatic
против ThreadLocal
, а также, позже фактически пула объектов и моим есть подстановки накладных расходов по сравнению с резьбовыми статическими полями, которые просто проживают в специальной области памяти для каждого потока.
Update
Я собирался проверить его на некоторое время, в любом случае, здесь код и выход. 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>' –