Я работаю над некоторыми приложениями, которые требуют очень низкой задержки и занимают много памяти, и некоторое время тестировал, как, например, выделение списка ad-hoc против предварительного выделения и очистки списка выполняет.
Я ожидал, что тестовые прогоны, в которых предварительно выделяется память, будут выполняться намного быстрее, но, к моему удивлению, они на самом деле немного медленнее (когда я даю тестовый прогон в течение 10 минут, средняя разница составляет около 400 мс).
Вот код теста, который я использовал:
class Program
{
private static byte[] buffer = new byte[50];
private static List<byte[]> preAlloctedList = new List<byte[]>(500);
static void Main(string[] args)
{
for (int k = 0; k < 5; k++)
{
Stopwatch sw = new Stopwatch();
sw.Start();
for (int i = 0; i < 1000000; i++)
{
List<byte[]> list = new List<byte[]>(300);
for (int j = 0; j < 300; j++)
{
list.Add(buffer);
}
}
sw.Stop();
Console.WriteLine("#1: " + sw.Elapsed);
sw.Reset();
sw.Start();
for (int i = 0; i < 1000000; i++)
{
for (int j = 0; j < 300; j++)
{
preAlloctedList.Add(buffer);
}
preAlloctedList.Clear();
}
sw.Stop();
Console.WriteLine("#2: " + sw.Elapsed);
}
Console.ReadLine();
}
}
Теперь, что действительно интересно, я запускал perfmon бок о бок и увидел следующую схему, которая выглядит так, как я ожидал:
Зеленый = Gen 0 коллекций
Синий = Выделенные байты / сек
Красный =% Время в ГХ
Консольное приложение ниже показывает время выполнения теста для # 1 и # 2

Итак, мой вопрос: почему Тест № 1 быстрее, чем # 2?
Очевидно, что я предпочел бы иметь в своем приложении статистику Permon Test # 2, так как в основном нет нагрузки на память, нет сборок GC и т. Д., Хотя # 1, кажется, немного быстрее?
Несет ли List.Clear () столько накладных расходов?
Спасибо
Tom
EDIT
Я сделал еще один тест, с той же настройкой, но запустив приложение с включенным GC сервера, теперь № 2 становится немного быстрее
