В C # я запускаю игрушечный код, который создает много маленьких объектов (которых, я знаю, в идеале следует избегать - я просто хочу изучить проблему).При одинаковом общем количестве созданных объектов один поток работает быстрее, чем один поток на процессор (Parallel.For).
Атомарное действие состоит в создании списка (фактически массива), содержащего 20 тыс. Небольших объектов (здесь длинных[4] для простоты):
private static void CreateList()
{
long[][] list = new long[20000][];
for (var i = 0; i < 20000; i++)
list[i] = new long[4];
}
Если я создаю 1000 списков в одном потоке, он запускается за 1,5 с.Если я создаю 1000 списков с несколькими потоками (каждый из которых отвечает за подмножество 1000 списков), он запускается за 2 с.
Поведение практически одинаково, когда:
- с использованием классическогомаленькие объекты вместо длинных [4]
- с использованием реального списка вместо массива
- с использованием различного количества объектов
Не могли бы вы объяснить, почему?Есть ли в диспетчере памяти «блокировка».Это связано со сборкой мусора?
Подробности кода:
public static void Main()
{
Benchmark(1000, CreateList);
}
private static void Benchmark(int repeat, Action action)
{
Console.WriteLine("Single thread");
Benchmark(delegate ()
{
for (int i = 0; i < repeat; i++)
action();
});
Console.WriteLine("Multi thread");
Benchmark(delegate ()
{
Parallel.For(0, repeat, i => action());
});
}
private static void Benchmark(Action action)
{
for (int i = 0; i < 10; i++)
{
Stopwatch sw = new Stopwatch();
sw.Start();
action();
sw.Stop();
Console.WriteLine("Time : " + sw.Elapsed.TotalSeconds);
}
}