powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / О QuickSort не говори
25 сообщений из 66, страница 2 из 3
О 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
25 сообщений из 66, страница 2 из 3
Форумы / Delphi [игнор отключен] [закрыт для гостей] / О QuickSort не говори
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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