Мы с другом были немного озадачены во время дискуссий по программированию. В качестве примера мы создали фиктивную проблему наличия List<int>
из n случайных целых чисел (обычно 1.000.000) и хотели создать функцию, которая вернула множество всех целых чисел, число которых было более одного. Довольно простой материал. Мы создали один оператор LINQ для решения этой проблемы и простой алгоритм сортировки вставки.Почему операции LINQ быстрее, чем обычный цикл?
Теперь, когда мы протестировали скорость, с которой работал код (с использованием System.Diagnostics.StopWatch
), результаты были сбивчивыми. Не только код LINQ превосходил простую сортировку, но он работал быстрее, чем , одинforeach
/, который сделал только один цикл списка и не имел операций внутри (что на боковой дорожке я думал, что компилятор должен был обнаружить и удалить все вместе).
Если мы сгенерировали новый List<int>
случайных чисел в одном и том же исполнении программы и снова запустили код LINQ, производительность увеличилась бы на порядки (обычно в тысячу раз). Производительность пустых петель была, конечно, одинаковой.
Итак, что здесь происходит? Является ли LINQ с использованием параллелизма превосходить обычные циклы? Как эти результаты возможны? LINQ использует quicksort, который работает в n * log (n), который по определению уже медленнее n.
А что происходит при скачке производительности во втором прогоне?
Мы были оба озадачены и заинтригованы этими результатами и надеялись на некоторые разъясняющие идеи сообщества, чтобы удовлетворить наше собственное любопытство.
Пожалуйста, разместите код. –
Возможно, вы могли бы поделиться своим тестом? –
Отправьте свой код. Вероятно, вы не рассматриваете [отложенное исполнение] (http://blogs.msdn.com/b/charlie/archive/2007/12/09/deferred-execution.aspx). –