Update я теперь достичь лучше, чем 1.7x форсировки по двухъядерным машине.
Я думал, что попробую написать параллельный сортировщик, который работал в .NET 2.0 (я думаю, провери меня), и это не использует ничего, кроме ThreadPool
.
Вот результаты сортировки массива 2000000 элемента:
Time Parallel Time Sequential
------------- ---------------
2854 ms 5052 ms
2846 ms 4947 ms
2794 ms 4940 ms
... ...
2815 ms 4894 ms
2981 ms 4991 ms
2832 ms 5053 ms
Avg: 2818 ms Avg: 4969 ms
Std: 66 ms Std: 65 ms
Spd: 1.76x
я получил 1.76x - довольно ускорение близко к оптимальному 2x я надеялся - в этой среде:
- 2 000 000 случайных
Model
объектов
- Сортировка объектов делегатом сравнения, который сравнивает два свойства
DateTime
.
- Mono JIT компилятор версии 2.4.2.3
- Max OS X 10.5.8 на 2,4 ГГц Intel Core 2 Duo
На этот раз я использовал Ben Watson's QuickSort in C#.Я изменил свой QuickSort
внутренний цикл из:
QuickSortSequential:
QuickSortSequential (beg, l - 1);
QuickSortSequential (l + 1, end);
к:
QuickSortParallel:
ManualResetEvent fin2 = new ManualResetEvent (false);
ThreadPool.QueueUserWorkItem (delegate {
QuickSortParallel (l + 1, end);
fin2.Set();
});
QuickSortParallel (beg, l - 1);
fin2.WaitOne (1000000);
fin2.Close();
(. На самом деле, в коде я немного балансировки нагрузки, что делает, кажется, помогает)
Я что эта параллельная версия работает только при наличии более 25 000 элементов в массиве (хотя, как минимум, 50 000, как мне кажется, позволяют моему процессору больше дышать).
Я сделал так много улучшений, как я могу думать о своей маленькой двухъядерной машине. Я хотел бы попробовать некоторые идеи по 8-стороннему монстру. Кроме того, эта работа была выполнена на небольшом 13-дюймовом MacBook, работающем под управлением Mono. Мне любопытно, как другие платят за обычную установку .NET 2.0.
Исходный код во всей его уродливой славе доступен здесь: http://www.praeclarum.org/so/psort.cs.txt. очистить его, если есть какой-либо интерес.
Если сортировка должна быть стабильной (равные элементы сохраняют свой первоначальный порядок), или если сравнения дороги (меньше сравнений), алгоритм [mergesort] (http://www.martinstoeckli.ch/csharp/parallel_mergesort.html) является хорошим альтернатива быстрой сортировке. – martinstoeckli