Почему метод For параллельного класса со временем становится быстрее?

#c# #.net #asp.net-core #logic

#c# #.net #asp.net-core #Логические

Вопрос:

Я провожу некоторое тестирование, чтобы обнаружить некоторые дубликаты в сгенерированных числах UUID, и я использую разные подходы для выполнения вычисления. Это multithreading , a normal for loop и the for method of the Parallel class . Multithreading является явным победителем, normal for loop проигравшим, а Parallel.For метод со временем становится быстрее. Я провел 10 тестов с Parallel.For , и время сократилось с 18,08 секунды до 11,80 секунды. Я всегда запускаю проект для выполнения одного теста за раз, поэтому я считаю, что он не может быть сохранен в памяти. И я больше ничего не делал на своем компьютере во время теста.

Это результаты тестирования Parallel.For метода:

 1: 00:00:18.08
2: 00:00:17.04
3: 00:00:16.79
4: 00:00:15.15
5: 00:00:13.00
6: 00:00:12.69
7: 00:00:12.66
8: 00:00:12.54
9: 00:00:12.33
10: 00:00:11.80
  

Есть ли этому какое-либо логическое объяснение?

Кстати, вот код, если это необходимо:

 // In Main
Parallel.For(0, 10, i =>
            {
                TestForUUIDDuplicates(i   1);
            });

static void TestForUUIDDuplicates(object loopIndex)
    {
        if (!(loopIndex is int))
        {
            throw new InvalidCastException();
        }

        var uuids = new List<string>();

        for (int i = 0; i < 1000000; i  )
        {
            if (i % 100000 == 0) System.Console.WriteLine("Reached {0} in loop {1}", i, loopIndex);

            uuids.Add(GenerateUUID());
        }

        System.Console.WriteLine("Finished adding UUIDs in loop {0}.", loopIndex);

        var duplicates = uuids
            .GroupBy(uuid => uuid)
            .SelectMany(group => group.Skip(1)).ToList();

        System.Console.WriteLine("Finished finding duplicates in loop {0}.", loopIndex);

        foreach (var duplicate in duplicates)
        {
            Console.WriteLine(duplicate);
        }

        if (duplicates.Count == 0)
        {
            Console.WriteLine("No duplicates found in loop {0}.", loopIndex);
        }
        else
        {
            _duplicates.AddRange(duplicates);
        }

        Console.WriteLine("Finished loop {0}", loopIndex);
    }

    private static string GenerateUUID()
    {
        // var ticks = DateTime.Now.Ticks;
        var ticks = DateTime.Now.Ticks;
        var guid = Guid.NewGuid().ToString();
        return ticks.ToString()   '-'   guid;
    }
  

Комментарии:

1. предположения, но: 1) рост пула потоков (восхождение на холм) означает, что у вас есть больше потоков, доступных в более поздних тестах? 2) многоуровневая JIT-компиляция означает, что позже вы используете более агрессивно оптимизированные коды операций?