Вы превысили возможности кэша вашего процессора и большую часть времени проводите в ожидании оперативной памяти.
Постепенно уменьшая количество элементов, я получаю следующие результаты (на List<int>
):
count time (s) slowdown
100000000 16.0429005 11.99215276436421
10000000 01.3377832 20.37312930505406
1000000 00.0656641 13.36837069158574
100000 00.0049119
Обратите внимание на большое замедление между 10 ^ 6 и 10 ^ 7. Я увеличил количество элементов в 10 раз, но время увеличилось в 20 раз. Вероятно, именно здесь мой ЦП больше не может помещать большую часть массива на 2-й (и последний на моем ЦП) уровень кэша.
Кстати, вы можете получить секунду или две (но потерять общность), заменив IList<T>
на List<T>
в сигнатуре метода и избежав штрафа за интерфейсный вызов на []
:
IList<T>: 16.0429005 s
List<T>: 14.3529349 s
Для записи в Visual C ++ 2010 std::random_shuffle
на std::vector<int>
с 100000000 элементов занимает ...
17.947 s
... так что вы, вероятно, уже так быстро, как только можете.
(ПРИМЕЧАНИЕ. Тесты C # и C ++ выполнялись в соответствующих конфигурациях Release вне отладчика.)