Мы с другом были немного озадачены во время сегодняшней дискуссии по программированию.В качестве примера мы создали фиктивную проблему наличия List<int>
из n случайных целых чисел (обычно 1.000.000) и хотели создать функцию, которая возвращала бы набор всех целых чисел, которых было больше одного.Довольно простые вещи.Мы создали один оператор LINQ для решения этой проблемы и простой алгоритм, основанный на сортировке вставок.
Теперь, когда мы проверили скорость выполнения кода (используя System.Diagnostics.StopWatch
), результаты оказались неясными.Мало того, что код LINQ превзошел простую сортировку, он работал быстрее, чем один foreach
/ for
, который выполнял только один цикл в списке и не имел операций внутри (который,на стороне, я думал, что компилятор должен был обнаружить и удалить все вместе.)
Если мы сгенерировали новые List<int>
случайных чисел в том же выполнении программы и снова запустили код LINQ,производительность увеличится на порядки (как правило, в тысячи раз).Производительность пустых циклов была, конечно, одинаковой.
Итак, что здесь происходит?Использует ли LINQ параллелизм, чтобы превзойти нормальные циклы?Как эти результаты вообще возможны?LINQ использует быструю сортировку, которая выполняется при n * log (n), который по определению уже медленнее, чем n.
А что происходит при скачке производительности во втором запуске?
Мы оба былисбитые с толку и заинтригованные этими результатами и надеялись получить некоторые разъяснения от сообщества, просто чтобы удовлетворить наше собственное любопытство.