powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / О QuickSort не говори
66 сообщений из 66, показаны все 3 страниц
О QuickSort не говори
    #38717646
SOFT FOR YOU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Прав был Шарахов, когда 4 года назад в своём блоге сказал "быстрая сортировка обладает какой-то мистической силой, заставляя снова возвращаться к ней". В битве за удобством и скоростью мне удалось достичь определённых успехов и сегодня я поделюсь результатами своего труда, но сперва объясню, чем вообще вызвана необходимость доработать сортировку.
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
// "стандартная реализация" из модуля Classes
procedure QuickSort(SortList: PPointerList; L, R: Integer; SCompare: TListSortCompare);
var
 I, J: Integer;
 P, T: Pointer;
begin
 repeat
   I := L;
   J := R;
   P := SortList^[(L + R) shr 1];
   repeat
     while SCompare(SortList^[I], P) < 0 do Inc(I);
     while SCompare(SortList^[J], P) > 0 do Dec(J);
     if I <= J then
     begin
       T := SortList^[I];
       SortList^[I] := SortList^[J];
       SortList^[J] := T;
       Inc(I);
       Dec(J);
     end;
   until I > J;
   if L < J then QuickSort(SortList, L, J, SCompare);
   L := I;
 until I >= R;
end;


1) По долгу службы мне периодически приходится обрабатывать внушительные объёмы данных и совсем не редкая операция - сортировка. В модуле Classes в своё время я нашёл реализацию и достаточно долго использовал её (листинг выше). Но в реальных условиях нужно сортировать не указатели, а структуры. Периодически приходилось создавать вспомогательный массив указателей, инициализировать и позже вызывать QuickSort. В конечном счёте потребовалось простое решение, при помощи которого можно оперативно "создать" требуемую сортировку.
2) Конечно напрашивается решение - использовать шаблоны. Но в Delphi7 шаблонов нет, а современные дженерики обладают существенным рядом недостатков, о которых поговорим позже.
3) В теории глубина рекурсии в QuickSort в худшем случае - равна N. В Delphi реализации ситуация оптимизируется, но не решается кардинально. А значит в зависимости от набора данных вполне существует вероятность, что скажем при сортировке миллиона элементов произойдёт переполнение стека. Ситуация усугубляется тем, что на платформе x64 стек в рекурсиях расходуется значительно быстрее, чем на x86 и ARM. Мне же удалось реализовать решение, которое не только не приведёт к переполнению стека, но и затратит в худшем случае 1кб на платформе x64.
4) Я обнаружил, что львиную долю времени сортировки занимает вызов калбека сравнения. Необходимость в нём на практике возникает не всегда. Мы часто сравниваем 1-2 поля, причём числовых, а значит реализовав сравнение вручную или вызвав inline оператор (надеюсь такие есть) - мы существенно повысим производительность сортировки. К сожалению дженерики не позволяют использовать операторы сравнения, а функции-компараторы гарантированно дают просадку производительности (что отлично видно на тесте с Integer). К слову привычные компараторы тоже используются неэффективно. В своё время Sha посвятил небольшой раздел правильному сравнению Integer с громким названием "Самая быстрая на Земле". Но в умных реализациях сортировки на С++ используется оператор < (LessThan), которого достаточно, и который существенно упрощает и сокращает время сравнения.
Код: pascal
1.
2.
3.
4.
QuickSort(Integer) test:
Generics QuickSort (standard)... 3838ms.
Asm QuickSort... 1856ms.
Smart QuickSort... 1451ms.


5) Вас ожидает сюрприз - если станете сортировать строки, варианты, интерфейсы, динамических массивы, замыкания или структуры их содержащие. Алгоритм быстрой сортировки минимум в двух местах предполагает чтение и запись структур. А при каждом копировании таких данных происходит невидимая рутина по инициализации и финализации данных. Не говоря уже о невидимом блоке try/finally, призванном подчищать данные по выходу из функции. Существует способ обойти внутреннюю рутину через копирование массива байт, но в рамках дженериков реализовать такой подход невозможно. В итоге при неумелой сортировке строк/массивов/структур/etc вас всегда ожидает просадка производительности. Что кстати легко заметить в тесте для строк. В обоих случаях используется стандартный RTL компаратор строк, но буферизируются элементы по разному.
Код: pascal
1.
2.
3.
QuickSort(String) test:
Generics QuickSort (standard)... 18596ms.
Smart QuickSort... 6911ms.


6) Одна из оптимизаций - сортировка вставками для малых (под)массивов. Реализацию брал и оптимизировал у Шарахова.
7) Ну и наконец оптимизации на низком уровне. Поскольку конечное время работы зависит от объёма исполненных тактов, а количество регистров крайне мало - путём титанических усилий, мне всё-таки удалось выжать из компилятора Delphi максимум :)

Собственно всё. Используйте кому нужно. Скопируйте функцию и замените <T> на ваш тип.
Несмотря на страшный вид функций, бинарный размер у них примерно равен дженерик-реализациям. Для сортировки Integer порядка 288 байт если не ошибаюсь.

Ссылка:
http://webfile.ru/8ea97d85dff9b007d66aef7b251f7e1d
...
Рейтинг: 0 / 0
О QuickSort не говори
    #38717681
white_nigger
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ох не говори про него. Несколько лет назад для наших библиотек я тоже написал вариацию. В ней нет ни одной ассемблерной инструкции, а процедура сравнения передается как параметр (а не жестко зашита в алгоритм). Результаты на моем компе:

QuickSort(Integer) test:
Generics QuickSort (standard)... 3198ms.
Asm QuickSort... 1544ms.
Smart QuickSort... 1248ms.
DX QuickSort... 733ms.

Press Enter

QuickSort(String) test:
Generics QuickSort (standard)... 13650ms.
Smart QuickSort... 5258ms.
DX QuickSort... 2995ms.

Press Enter

Хинт. Юзай многопоточность, раз уж у тебя такие "тяжелые" задачи
...
Рейтинг: 0 / 0
О QuickSort не говори
    #38717684
fd00ch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
white_nigger, твои результаты за счет использования кучи ядер, или DX реализация однопоточная?
...
Рейтинг: 0 / 0
О QuickSort не говори
    #38717685
white_nigger
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ессно, выигрыш получается при использовании многопоточности, там главная хитрость, определить когда её можно использовать :). А так даже на древних 2х-ядерных процах есть ускорение. Причем зависимость нелинейная, сказываются особенности алгоритмов
...
Рейтинг: 0 / 0
О QuickSort не говори
    #38717688
asviridenkov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SOFT FOR YOU,

Какие условия использования кода?
...
Рейтинг: 0 / 0
О QuickSort не говори
    #38717713
SOFT FOR YOU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
white_nigger

красавчик!
тока у меня не настолько большие объёмы. тысяч 10 максимум. но часто.
распараллеливание думаю мало поможет. но скинь сорсы посмотреть.

p.s.
у меня тоже ассемблера нет
...
Рейтинг: 0 / 0
О QuickSort не говори
    #38717721
SOFT FOR YOU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
asviridenkovКакие условия использования кода?
любые :))
...
Рейтинг: 0 / 0
О QuickSort не говори
    #38717723
asviridenkov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SOFT FOR YOUasviridenkovКакие условия использования кода?
любые :))

Тогда есть смысл посмотреть на код!

Ты раз такой любитель оптимизации, то обратил бы внимание на другой аспект.
У меня вот гораздо чаще возникают претензии к скорости поиска а не сортировки.
С появлением TDictionary стало получше, но все равно говорят что там до оптимальности очень далеко, особенно в
плане скорости работы хэш-функции.
Вот если бы ты написал что-то компилируемое во всей линейке XE2+ 32/64 всеплатформенное и работающее быстрее, было бы круто.
...
Рейтинг: 0 / 0
О QuickSort не говори
    #38717724
SOFT FOR YOU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
asviridenkov

быстрее хешей ничего нет
у меня есть наработки, которых мне хватает, но они под x86
...
Рейтинг: 0 / 0
О QuickSort не говори
    #38717725
asviridenkov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SOFT FOR YOU asviridenkov

быстрее хешей ничего нет
у меня есть наработки, которых мне хватает, но они под x86

Да это понятно. Там хеш-функция не оптимальная.
Под х86 не интересно. Нужна на дженериках и всеобщая
...
Рейтинг: 0 / 0
О QuickSort не говори
    #38717726
SOFT FOR YOU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
asviridenkov

напишу за 10 тыщ если нужно :)
...
Рейтинг: 0 / 0
О QuickSort не говори
    #38717730
white_nigger
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SOFT FOR YOUу меня тоже ассемблера нетПросто я в своё время тоже просматривал решения Шарахова, а у него там самые быстрые были как раз ассемблерные версии. А вообще я отписался здесь исходя из того, что много людей не всегда верно подходят к задачам оптимизации. За долгие годы работы в ДХ я косвенно общался с многими программистами (а не энд-юзерами как многие тут) и не раз это наблюдал. Чаще всего реальный прирост дает не попытка сэкономить десяток-другой ассемблерных команд, а изменение архитектуры или пересмотр алгоритмов.

PS:
Поскольку свой код публиковать не имею права, подскажу что в инете можно найти подобные решения. По сути надо исходные данные разбить на блоки и в потоках выполнить QuickSort для каждого. А потом также используя потоки смержить результаты. Правда, как замечал ранее, перед этим надо убедиться что процедура сравнения потокобезопасна
...
Рейтинг: 0 / 0
О QuickSort не говори
    #38717732
white_nigger
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SOFT FOR YOUтысяч 10 максимум. но часто.
распараллеливание думаю мало поможет. но скинь сорсы посмотретьПоможет. Обычно процедура сравнения более тяжелая чем простое сравнение чисел (для этого случая вообще лучше поразрядную сортировку использовать). А если у тебя есть наши продукты, то реализацию можешь посмотреть в классе TdxMultithreadedSort модуль dxThreading. Также распараллеливанием легко ускоряется поиск в неотсортированных данных (TList, TStrings) и пакетные обработки
...
Рейтинг: 0 / 0
О QuickSort не говори
    #38717734
SOFT FOR YOU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
white_nigger

а почему кстати зависимость нелинейная?
а поразрядная сортировка да, рулит :)
...
Рейтинг: 0 / 0
О QuickSort не говори
    #38717746
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
asviridenkovС появлением TDictionary стало получше, но все равно говорят что там до оптимальности очень далеко, особенно в
плане скорости работы хэш-функции.
Вот если бы ты написал что-то компилируемое во всей линейке XE2+ 32/64 всеплатформенное и работающее быстрее, было бы круто.
Для хэш-функции словаря важна не только скорость, но и распределение, в этом плане Дженкинс очень годное решение. Я их перепробовал штук 15, наверное, на трех наборах данных: словаре английских слов, массиве GUID'ов и строковом представлении инкрементируемого счетчика format('index%d', [counter]). Впрочем, для конкретных типов ключей можно задействовать собственные хэши, достаточно создать словарь с кастомным компарером. Например для строк очень хорошую скорость и распределение дает функция Роберта Седжвика, я использую её в своем "аналоге" словаря (по скорости поиска уделываю его раза в полтора [можно еще ускорить, но структура данных из-за поддержки индексации сильно не cache friendly], по добавлению более двух раз, по потреблению памяти экономичнее на четверть). У словаря по-дурацки сделано распределение памяти при заранее заданной вместимости (capacity), оно всегда получается примерно на треть больше необходимого.
...
Рейтинг: 0 / 0
О QuickSort не говори
    #38717816
SOFT FOR YOU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kazantsev Alexey

По моему люди сильно переоценивают значение хеш-функции. Во-первых, даже самая крутая хеш-функция не обезопасит тебя от хеш-промахов. А во-вторых, люди мутят такие функции, что себестоимость её вызова значительно выше обрабатываемых промахов.

Значительно важнее организация хеш-таблицы и менеджмент памяти. В теории размер таблицы должен быть простым числом (для лучшего распределения), на практике размер должен быть степенью двойки, ибо операция вычисления индекса через остаток от деления убивает к чертям весь профит. Ну и стандартному менеджеру памяти можно предпочесть альтернативный, потому что структуры имеют одинаковый размер и заточка на многопоточность не нужна (если конечно контейнер не с многопоточным доступом).
...
Рейтинг: 0 / 0
О QuickSort не говори
    #38717871
vavan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SOFT FOR YOUпочему кстати зависимость нелинейная?
я как-то пробовал выпытать оценку по ихнему варианту (однопоточному) но в итоге нашару подобрал формулу к-я давала б.м. подходящий мне вариант

white_niggerя отписался здесь исходя из того, что много людей не всегда верно подходят к задачам оптимизацииугу, хорошо бы иногда вместо того чтоб оптимайзить сортировки (что конечно само по себе и похвально) элементарно вычистить реализацию базовых вещей дабы избегать попросту ненужных (но весьма дорогостоящих) операций как например в Q515958, Q516328, Q515220 и т.п.
...
Рейтинг: 0 / 0
О QuickSort не говори
    #38717879
vavan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SOFT FOR YOUтока у меня не настолько большие объёмы. тысяч 10 максимум. но часто.
распараллеливание думаю мало поможета у них там такой оверхед на самом контейнере и датаконтроллере что многопоточность оказалась реальным подспорьем. а так ср-вами например датасета сортировка даже в однопоточном варианте в разы быстрее фурычит
...
Рейтинг: 0 / 0
О QuickSort не говори
    #38718045
white_nigger
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vavanугу, хорошо бы иногда вместо того чтоб оптимайзить сортировки (что конечно само по себе и похвально) элементарно вычистить реализацию базовых вещей дабы избегать попросту ненужных (но весьма дорогостоящих) операций как например в Q515958, Q516328, Q515220 и т.п.Или спроектировать приложение нормально, чтоб не было нужды тащить сотни тысяч записей на клиент. Это даст гораздо более ощутимый прирост быстродействия. К тому же не всегда есть возможность, избавиться от двойных вызовов, или пересчетов. Ты просто не видишь полной картины и не представляешь всех возможных сценариев использования. Кстати зачем тебе в Q515958 одновременно и лочение грида и лочение датасета? Если правильно помню, там простым переставлением порядка локов можно было сэкономить лишний пересчет
...
Рейтинг: 0 / 0
О QuickSort не говори
    #38718086
vavan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
white_niggerИли спроектировать приложение нормально"расскажи моей бабуле про ее вставные зубы" (С) серьезно, не учите меня жить и я тогда не скажу куда вам следует пройти. разработчику либы невдомек как ее юзают конечные пользователи а отсюда он просто обязан минимизировать оверхэд и приложить максимум усилий к оптимизации. а в данных случаях скорее даже к избеганию "пессимизации"
white_niggerТы просто не видишь полной картины и не представляешь всех возможных сценариев использованияугу, я как раз об этом выше, не представляете. а лично меня заботят исключительно дата-аварные варианты, с иными изголяйтесь как хотите - мне поровну

white_niggerзачем тебе в Q515958 одновременно и лочение грида и лочение датасета? Если правильно помню, там простым переставлением порядка локов можно было сэкономить лишний пересчетувы, не всегда достаточно лочить лишь датасет, иногда приходится и грид а то еще и датаконтроллер отдельно
...
Рейтинг: 0 / 0
О QuickSort не говори
    #38718137
white_nigger
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vavanразработчику либы невдомек как ее юзают конечные пользователиХорошо подумал прежде чем написать? За эти годы просмотрел сотни если не тысячи юзеркейсов, причем некоторые не приснились бы и в кошмарах. А тому кто постоянно недоволен нашими продуктами, мы можем предложить вернуть деньги, дабы бедняга не "кушал кактусы" если уж наш продукт его так не устраивает, и спокойно писать фичи которые реально востребованы
...
Рейтинг: 0 / 0
О QuickSort не говори
    #38718145
white_nigger
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сорри за офтоп. Обычно я не обсуждаю такие вещи и не перехожу на личности, видать накипело. Завязываю...
...
Рейтинг: 0 / 0
О QuickSort не говори
    #38718221
vavan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
white_niggerХорошо подумал прежде чем написать?а думаешь брякнул как всегда бездумно?
white_niggerтому кто постоянно недоволен нашими продуктами, мы можем предложить вернуть деньгибуду чрезвычайно признателен если сделаете это по окончании очередного сабскрипшна к-й я продлил пару недель назад. собсно можно было бы и к зиме-весне (когда выйдет последний выпуск под 2007) но техдир заявил что поддержка крайней версии будет длиться еще год
...
Рейтинг: 0 / 0
О QuickSort не говори
    #38718306
white_nigger
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vavanбуду чрезвычайно признателен если сделаете это по окончании очередного сабскрипшна
по окончании? а это... не треснет? ;) в любом случае эти вопросы решаются не в этом топике и не на этом сайте
...
Рейтинг: 0 / 0
О QuickSort не говори
    #38718348
vavan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
white_niggerпо окончании?ну разумеется. поясню что все что было выложено за многолетнее обновление сабскрипшна и собсно саппорт к возврату и не ожидается
white_niggerа это... не треснет?ну я за язык никого не тянул. или это было неподкрепленное предложение?
...
Рейтинг: 0 / 0
О QuickSort не говори
    #38718855
hard for me
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
есть смысл маленькие подмассивы сортировать иначе - insertion_sort-ом
стандартная сортировка в джаве, например, так делает, порог = 32
...
Рейтинг: 0 / 0
О QuickSort не говори
    #38718858
hard for me
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
...
Рейтинг: 0 / 0
О QuickSort не говори
    #38718865
SOFT FOR YOU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hard for me

а там используется
пункт 6 в описании
...
Рейтинг: 0 / 0
О QuickSort не говори
    #38720225
optimiser
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
SOFT FOR YOU,
1) test_integers: заменил в шараховской HybridSortSha_AII вызовы Compare на прямое сравнение (+ пара правок под integer) - и она обогнала вашу (немного)

2) вставил в test_integers код вашего шаблона и поставил "type T = integer" - скорость оказалась чуточку, но медленнее чем у QuickSortInteger (мелочь, а неприятно)

3) еще по-мелочи: вы проверяли выигрыш самодельного "стека" по скорости? ведь при работе такого же решения, но с рекурсией, стек будет задействован на в точности ту же глубину - кстати, у вас она ограничена 64, а в системном явно больше
...
Рейтинг: 0 / 0
О QuickSort не говори
    #38720232
optimiser
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
з.ы. как ни странно, с test_strings таких проблем нет - измененный шаблон даже чуть быстрее, чем QuickSortString и шараховская от вашей отстала
...
Рейтинг: 0 / 0
О QuickSort не говори
    #38720260
optimiser
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
до кучи:
- для несколькисекундных тестов разрешение GetTickCount маловато - QueryPerformanceCounter гораздо лучше
- перед тестом стоит сделать Randomize, чтобы на разных запусках были разные данные
(хотя может быть смысл и не делать этого)
...
Рейтинг: 0 / 0
О QuickSort не говори
    #38720343
optimiser
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
а в целом, раз придраться больше не к чему, можешь считать, что все отлично :)
...
Рейтинг: 0 / 0
О QuickSort не говори
    #38720374
Aleksandr Sharahov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
optimiserз.ы. как ни странно, с test_strings таких проблем нет - измененный шаблон даже чуть быстрее, чем QuickSortString и шараховская от вашей отстала

Какая из? Их там много.
Ну, и выложить было бы неплохо куда-нить, а то, может, не то или не так тестировали.
Выравнивания опять же могут влиять.
Сам понимаешь, лучше один раз увидеть.

P.S.
Довольно трудно поверить в отставание, т.к. в плане ускорения
предложенный здесь вариант не содержит ничего нового
по сравнению с рассмотренными в статье вариантами.
...
Рейтинг: 0 / 0
О QuickSort не говори
    #38720804
optimiser
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Aleksandr Sharahov, возможно, я коряво заменил у вас вызовы Compare на прямые сравнения - с приведениями указателей к строкам
видимо, обрадовался, что моя наивная реализация оказалась чуть быстрее и этим удовлетворился
тестил в дельфи 7

мои комменты начинаются 4 слешами

по-хорошему тестирование нужно переделывать - не по 100 прогонов каждого, а 100 прогонов * (всех по очереди по 1 разу), и не суммировать время, а брать минимальное в микросекундах (имхо, так точнее)
...
Рейтинг: 0 / 0
О QuickSort не говори
    #38720808
optimiser
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
кстати, в fastcode есть CompareStr - может, она побыстрее встроенного сравнения будет?
и вроде у вас после всех сравнений "< 0" - Compare мог бы булеан возвращать и быть покороче
...
Рейтинг: 0 / 0
О QuickSort не говори
    #38720821
Aleksandr Sharahov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
optimiserкстати, в fastcode есть CompareStr - может, она побыстрее встроенного сравнения будет?
и вроде у вас после всех сравнений "< 0" - Compare мог бы булеан возвращать и быть покороче

Очевидно, что сортировки имеет смысл сравнивать, если у них функции сравнения одинаковы.
Поэтому алгоритмы часто записываются так, чтобы они использовали один тип сравнения,
обычно это сравнение "строго меньше". Что эквивалентно возврату булевского значения.

Если же вы используете разные функции сравнения,
то тем самым ставите проверяемые алгоритмы сортировки в неравное положение.

Описанные в моей статье алгоритмы допускают использование любых функций сравнения,
в том числе и возвращающих булевское значение.
...
Рейтинг: 0 / 0
О QuickSort не говори
    #38720833
Aleksandr Sharahov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
optimiserвидимо, обрадовался, что моя наивная реализация оказалась чуть быстрее и этим удовлетворился
тестил в дельфи 7


на E6850 (D7, InsCount=32 у всех алгоритмов) чуть быстрее те, что в статье:

QuickSort(String) test:
SmartQuickSort... 11581ms.
SmartQuickSortTemplate... 11533ms.
QuickSortSha_AII... 9689ms.
QuickSortSha_0AA... 9693ms.
QuickSortSha_A0I... 9691ms.
My DumbQuickSort... 10195ms.

Это неудивительно, т.к. это все это почти одинаковые алгоритмы.

В код особо не вникал, но замечу, что время измеряется довольно грязно:
включается копирование буфера, проверка правильности сортировки, перемежается с выводом - ужас.
...
Рейтинг: 0 / 0
О QuickSort не говори
    #38720880
SOFT FOR YOU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
optimiser

спасибо за участие!

автор1) test_integers: заменил в шараховской HybridSortSha_AII вызовы Compare на прямое сравнение (+ пара правок под integer) - и она обогнала вашу (немного)
рано или поздно нужно было это проверить
что круче: низкоуровневые оптимизации и алгоритмы
победили в очередной раз алгоритмы :)

автор2) вставил в test_integers код вашего шаблона и поставил "type T = integer" - скорость оказалась чуточку, но медленнее чем у QuickSortInteger (мелочь, а неприятно)
Это потому что сама функция универсальная
Чтобы скорость осталась прежней - нужно CMP_MODE выставить 1
Сейчас же копируется не интеджер, а массив байт - поэтому медленнее

автор3) еще по-мелочи: вы проверяли выигрыш самодельного "стека" по скорости? ведь при работе такого же решения, но с рекурсией, стек будет задействован на в точности ту же глубину - кстати, у вас она ограничена 64, а в системном явно больше
Проверять - не проверял. Но смысл в том, что в случае самодельного стека экономятся(оптимизируются) регистры, а так же снимаются накладные расходы на вызов функции - push/pop регистров в стек и call/ret. А что до глубины в 64 - так это явно с запасом :). На случай если в x64 приложении будет сортироваться массив байт размером 2^64 (я даже не знаю как такое число назвать) и при этом не будут использоваться сортировки вставками :)

авторз.ы. как ни странно, с test_strings таких проблем нет - измененный шаблон даже чуть быстрее, чем QuickSortString
это погрешности измерения
можешь сравнить код функций - должно быть идентично

автордо кучи:
- для несколькисекундных тестов разрешение GetTickCount маловато - QueryPerformanceCounter гораздо лучше
- перед тестом стоит сделать Randomize, чтобы на разных запусках были разные данные
(хотя может быть смысл и не делать этого)
я согласен, только времени было впритык
если внесёшь свою лепту - будет круто

Aleksandr Sharahovна E6850 (D7, InsCount=32 у всех алгоритмов) чуть быстрее те, что в статье:

QuickSort(String) test:
SmartQuickSort... 11581ms.
SmartQuickSortTemplate... 11533ms.
QuickSortSha_AII... 9689ms.
QuickSortSha_0AA... 9693ms.
QuickSortSha_A0I... 9691ms.
My DumbQuickSort... 10195ms.

Это неудивительно, т.к. это все это почти одинаковые алгоритмы.
Помоему результат отличный. Твои сортировки быстрее моей больше чем на 10%!
Не скажешь навскидку, в чём цимус? В трёх опорах? Я у себя побоялся их применять.

авторВ код особо не вникал, но замечу, что время измеряется довольно грязно:
включается копирование буфера, проверка правильности сортировки, перемежается с выводом - ужас.
Проверка корректности используется только в DEBUG
Копирование буфера... Я просто не знаю, как сделать лучше
Модернизируй пожалуйста тест и выложи сорсы
...
Рейтинг: 0 / 0
О QuickSort не говори
    #38721060
optimiser
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
модернизировал тест по-своему, выкладываю
Pentium E6700, Delphi 7
Код: plaintext
1.
2.
3.
4.
5.
6.
Iterations = 100
QS.SmartQuickSort:      98921 us
SmartQuickSort(Templ.): 98808 us
QuickSortSha_AII:       103392 us
QuickSortSha_0AA:       104485 us
QuickSortSha_A0I:       104016 us
My DumbQuickSort:       102547 us
...
Рейтинг: 0 / 0
О QuickSort не говори
    #38721119
optimiser
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
очевидно, разница в том, что в коре-дуо 4 МБ кэша 2 уровня, а в моём пентиуме - только 2
...
Рейтинг: 0 / 0
О QuickSort не говори
    #38721137
optimiser
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
на старом ноутбуке (T5600, тоже с 2 МБ кэша) более "закономерные" результаты:
"смарт" впереди, но хотя бы мой отстал от шараховского
...
Рейтинг: 0 / 0
О QuickSort не говори
    #38721247
optimiser
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
для полноты: размер L1 кэша у 2 моих процов (десктоп и ноут) тоже совпадает - 32 КБ * 2 ядра * 2 (данных+инструкций)
...
Рейтинг: 0 / 0
О QuickSort не говори
    #38721488
SOFT FOR YOU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
как может быть, что на одной конфигурации мой код работает быстрее, а на другой - Шарахова?
должен быстрее работать код Шарахова везде
...
Рейтинг: 0 / 0
О QuickSort не говори
    #38721525
optimiser
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
> должен

ситуация "works for me"
некому и не из кого "долг" выбивать: у каждого на его компе его код быстрее :)

btw, мы еще на атлонах не пробовали
с 64KB L1 cache
...
Рейтинг: 0 / 0
О QuickSort не говори
    #38721526
optimiser
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
я уж не говорю про x64
...
Рейтинг: 0 / 0
О QuickSort не говори
    #38721556
optimiser
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
optimiserу каждого на его компе его код быстрее :)в смысле, я тоже этого добился
было достаточно избавится от вложенности процедур, которую я ранее сделал в совершенно напрасной уверенности, что чем меньше параметров передается, тем лучше
правда, на некоторых данных (т.е. запусках - я вставил Randomize) Smart всё же обгонял Dumb
еще, неправильные способы (рекурсия правых, левых, больших половин) чуть обгоняют правильный (рекурсия меньших половин)
в общем, иллюзия борьбы далеко за гранью погрешности
...
Рейтинг: 0 / 0
О QuickSort не говори
    #38721568
SOFT FOR YOU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Хотелось бы, чтобы Александр сравнил и сказал, почему у него быстрее на 10%
Есть ли простая модификация, после которой мой код обгонит его
...
Рейтинг: 0 / 0
О QuickSort не говори
    #38721681
optimiser
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
SOFT FOR YOUу него быстрее на 10%это у тебя так? шо за проц?
а на моём железе у него медленнее, но от силы на 3-4%
(пень E6700, 2M L2 Cache, 3.20 GHz, 1066 FSB)

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
Iteration: 100, so far best times are:
QS.SmartQuickSort:      104737 us, stk_max: 0
SmartQuickSort(Templ.): 104823 us, stk_max: 16
QuickSortSha_AII:       108393 us, stk_max: 9
QuickSortSha_0AA:       109156 us, stk_max: 9
QuickSortSha_A0I:       108446 us, stk_max: 9
My DumbQuickSortL:      103555 us, stk_max: 21
My DumbQuickSortR:      105057 us, stk_max: 21
My DumbQuickSortLess:   104860 us, stk_max: 38
My DumbQuickSortBig:    104534 us, stk_max: 10
...
Рейтинг: 0 / 0
О QuickSort не говори
    #38721683
optemyzer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
немного поиграл с размерами массива данных и длинами строк, и понял, что пора бросать этой ерундой маяться: то один вперед вырвется, то другой...
в общем, единицы процентов не стоят серьезных усилий, разве что ради пиара и для маркетинга
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
О QuickSort не говори
    #39421119
SOFT FOR YOU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
asviridenkovТогда есть смысл посмотреть на код!

Ты раз такой любитель оптимизации, то обратил бы внимание на другой аспект.
У меня вот гораздо чаще возникают претензии к скорости поиска а не сортировки.
С появлением TDictionary стало получше, но все равно говорят что там до оптимальности очень далеко, особенно в
плане скорости работы хэш-функции.
Вот если бы ты написал что-то компилируемое во всей линейке XE2+ 32/64 всеплатформенное и работающее быстрее, было бы круто.

Представляю вашем вниманию альтернативную библиотеку шаблонов Rapid.Generics
https://github.com/d-mozulyov/Rapid.Generics

Бенчмарки сортировок, поисков и контейнеров привожу ниже. Бенчмарк по хеш-таблицам будет скорее всего на этой неделе, но в другой ветке.





P.S. Для оптимизации сортировок, небольшие части сортируются вставками. Для числовых предусмотрены так же поразрядные сортировки
P.P.S. Данные таблицы характерны для версий компилятора XE7+. На версиях ниже, производительность будет существенно отличаться
...
Рейтинг: 0 / 0
О QuickSort не говори
    #39421269
Фотография JayDi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SOFT FOR YOU,

а что на счет коллизий?
...
Рейтинг: 0 / 0
О QuickSort не говори
    #39421314
SOFT FOR YOU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
JaDi,

Хеши в другой ветке обсудим :)
Или ты про другое говоришь?
...
Рейтинг: 0 / 0
О QuickSort не говори
    #39421333
Фотография JayDi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SOFT FOR YOU,

о них самых
...
Рейтинг: 0 / 0
О QuickSort не говори
    #39484219
Vizit0r
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SOFT FOR YOU

поставил Rapid.Generics вместо стандартных генериков в XSuperObject

Получил
First chance exception at $00DE03E7. Exception class $C0000005 with message 'access violation at 0x00de03e7: read of address 0x000000cc'. Process Stealth_Elka2017.exe (5156)

в

function TList<T>.InternalIndexOf(const Value: T): NativeInt;

строка 17029.

Это вызов Contains



Delphi Seattle.
...
Рейтинг: 0 / 0
О QuickSort не говори
    #39484230
SOFT FOR YOU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Vizit0r,

Привет. Давай разбираться. Выложи какой-то тестовый проект, где повторяется ошибка. Или сам оттрейсь, найди, где косяк, а я уже поправлю.
...
Рейтинг: 0 / 0
О QuickSort не говори
    #39484244
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SOFT FOR YOU,

вот всегда удивлялся косячности реализации QSort в дельфи.
даже в 10-ке, так и не поправили уход в рекурсию

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
class procedure TArray.QuickSort<T>(var Values: array of T; const Comparer: IComparer<T>;
  L, R: Integer);
var
  I, J: Integer;
  pivot, temp: T;
begin
  if (Length(Values) = 0) or ((R - L) <= 0) then
    Exit;
  repeat
    I := L;
    J := R;
    pivot := Values[L + (R - L) shr 1];
    repeat
      while Comparer.Compare(Values[I], pivot) < 0 do
        Inc(I);
      while Comparer.Compare(Values[J], pivot) > 0 do
        Dec(J);
      if I <= J then
      begin
        if I <> J then
        begin
          temp := Values[I];
          Values[I] := Values[J];
          Values[J] := temp;
        end;
        Inc(I);
        Dec(J);
      end;
    until I > J;
    if L < J then
      QuickSort<T>(Values, Comparer, L, J);
    L := I;
  until I >= R;
end;


в том же fpc вполне кошерно
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
Procedure QuickSort(FList: PPointerList; L, R : Longint;
                     Compare: TListSortCompare);
var
  I, J : Longint;
  P, Q : Pointer;
begin
 repeat
   I := L;
   J := R;
   P := FList^[ (L + R) div 2 ];
   repeat
     while Compare(P, FList^[i]) > 0 do
       I := I + 1;
     while Compare(P, FList^[J]) < 0 do
       J := J - 1;
     If I <= J then
     begin
       Q := FList^[I];
       Flist^[I] := FList^[J];
       FList^[J] := Q;
       I := I + 1;
       J := J - 1;
     end;
   until I > J;
   // sort the smaller range recursively
   // sort the bigger range via the loop
   // Reasons: memory usage is O(log(n)) instead of O(n) and loop is faster than recursion
   if J - L < R - I then
   begin
     if L < J then
       QuickSort(FList, L, J, Compare);
     L := I;
   end
   else
   begin
     if I < R then
       QuickSort(FList, I, R, Compare);
     R := J;
   end;
 until L >= R;
end; 

...
Рейтинг: 0 / 0
О QuickSort не говори
    #39484251
SOFT FOR YOU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kealon(Ruslan),

У меня сортировка без рекурсии вообще )
...
Рейтинг: 0 / 0
О QuickSort не говори
    #39484285
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SOFT FOR YOUkealon(Ruslan),

У меня сортировка без рекурсии вообще )странный там у тебя микс
...
Рейтинг: 0 / 0
О QuickSort не говори
    #39484332
schi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Vizit0rSOFT FOR YOU

поставил Rapid.Generics вместо стандартных генериков в XSuperObject

Получил
First chance exception at $00DE03E7. Exception class $C0000005 with message 'access violation at 0x00de03e7: read of address 0x000000cc'. Process Stealth_Elka2017.exe (5156)

в

function TList<T>.InternalIndexOf(const Value: T): NativeInt;

строка 17029.

Это вызов Contains



Delphi Seattle.

Зато быстро и оптимизированно!
Охота тебе время тратить, удивляюсь.
...
Рейтинг: 0 / 0
О QuickSort не говори
    #39484602
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
возможно глупый совет - порыться в Spring4Delphi - причем не в готовых имсходниках, а в истории развития, закрытых багах и т.д.

хотя оно и поверх стандартных генериков и стандартного TValue написано

Потому что с проблемами реализации низкоуровневых привязок к разным версиям Delphi там накушались по самое не могу, можно поискать чужие грабли, прежде чем самому впрыгивать
...
Рейтинг: 0 / 0
О QuickSort не говори
    #39484730
Vizit0r
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SOFT FOR YOUVizit0r,

Выложи какой-то тестовый проект, где повторяется ошибка. Или сам оттрейсь, найди, где косяк, а я уже поправлю.

да фиг ли там выкладывать, в посте выше расписаны полтора действия для повторения ошибки.
Хотя ладно, сделал тестовый проект, приложил.

Трейсить не буду, я от простого заглядывания в процедуру, где АВ вылетает, чуть сознание от ужаса не потерял. Не для моего слабого мозга такое.
...
Рейтинг: 0 / 0
О QuickSort не говори
    #39484750
asviridenkov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Vizit0r
Трейсить не буду, я от простого заглядывания в процедуру, где АВ вылетает, чуть сознание от ужаса не потерял. Не для моего слабого мозга такое.

Это называется "write-only code". Если что не так работает, найти причину - без шансов.
...
Рейтинг: 0 / 0
О QuickSort не говори
    #39485112
SOFT FOR YOU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Vizit0r,

Спасибо. Доберусь до компа - посмотрю

asviridenkov,

Ой, да ладно сгущать краски. Есть массив, происходит обход всех элементов и сравнение со значением.
...
Рейтинг: 0 / 0
О QuickSort не говори
    #39485143
bk0010
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
asviridenkovVizit0rТрейсить не буду, я от простого заглядывания в процедуру, где АВ вылетает, чуть сознание от ужаса не потерял. Не для моего слабого мозга такое.
Это называется "write-only code". Если что не так работает, найти причину - без шансов.Все, что писалось с трудом, должно с трудом и читаться (шутка).
...
Рейтинг: 0 / 0
О QuickSort не говори
    #39485150
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
asviridenkovЭто называется "write-only code". Если что не так работает, найти причину - без шансов.
Не, первые полгода-год сам автор еще разобраться может. ;)
...
Рейтинг: 0 / 0
О QuickSort не говори
    #39485217
SOFT FOR YOU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Vizit0r,

Спасибо
Посмотрел, исправил, залил в репозиторий
...
Рейтинг: 0 / 0
66 сообщений из 66, показаны все 3 страниц
Форумы / Delphi [игнор отключен] [закрыт для гостей] / О QuickSort не говори
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]