[00:38:28] <ada_ru> (insert_reference_here)  отвечает (I_vlxy_I) на <во, такой раст работ…>
А, ещё лучше поменять sort на sort_unstable
[00:38:29] <ada_ru> (I_vlxy_I) unstable работает существенно медленней
[00:38:32] <ada_ru> (Максим)  отвечает (I_vlxy_I) на <btw: а как в аде выд…>
В Ada.Text_IO есть переменная
[00:38:37] <ada_ru> (I_vlxy_I) А вот пока результаты Ады (реализация которую Максим прислал):
real  1m35.016s
real  1m37.453s

Собиралось так: gcc -c -gnat12 -O3 -gnatn -gnatp -g main.adb
Запускалось так: time ./main ~/test/file.txt /dev/null
[00:38:45] <ada_ru> (I_vlxy_I)  отвечает (insert_reference_here) на <https://doc.rust-lan…>
выкидывание мьютекса дало прирост производительности еще на 2-3 секунды. но вывод всё равно жрет неоправданно много ядерного времени:

real    0m59.786s
user    0m49.667s
sys     0m9.848s

Вот 8 секунд sys тут приходится на writeln! ( https://godbolt.org/z/NW5Ht3 ), точнее на цикл с ним.
[00:55:18] <ada_ru> (I_vlxy_I) гм. а моя плюсатая реализация, несмотря на то, что оно не было заточено под однопоточность, работает быстрее чем стандартный sort
[00:57:10] <ada_ru> (I_vlxy_I) то есть вот для референса: c++: real    0m33.421s
стандартный sort: real    0m41.616s
rust: real    0m59.786s
ada (без проверок):  real  1m35.016s
ada (с проверками): real  4m54.388s
[00:57:41] <ada_ru> (I_vlxy_I) это всё - однопоточное.
[00:59:21] <ada_ru> (I_vlxy_I) при этом до Ады еще ещё не добрался в плане кода 😊
[01:04:41] <ada_ru> (I_vlxy_I) (стандарный, GNU sort — это Си)
[03:16:23] <ada_ru> (I_vlxy_I) https://vk.com/badcomedian?w=wall-25557243_3362478
[03:16:36] <ada_ru> (I_vlxy_I) https://sun1-1.userapi.com/c848628/v848628384/142ef5/6j6Xp5sIbos.jpg
[11:53:39] <ada_ru> (Максим) Я могу тебе скинуть сортировку на Аде по образу как ты для раста написал, но будет еще медленее, я думаю
[12:04:10] <ada_ru> (Максим) http://www.ada-ru.org/editor.html?id=3qNcrYM4lQmvn4VifKgWdQ==
[12:18:57] <ada_ru> (I_vlxy_I)  отвечает (Максим) на <http://www.ada-ru.or…>
Спасибо. Вечером гляну по скорости.
[12:19:38] <ada_ru> (I_vlxy_I) Оптимизация иногда контринтуитивна. Вон, выше в плане раста предлагали юзать unstable_sort, однако это лишь замедлило прогу.
[12:29:54] <ada_ru> (I_vlxy_I)  отвечает (Максим) на <http://www.ada-ru.or…>
Спасибо. Вечером гляну.
[12:52:34] <ada_ru> (I_vlxy_I) картинка https://www.ada-ru.org/files/bot/2019-03-04-x1.jpg
[12:52:39] <ada_ru> (I_vlxy_I) картинка https://www.ada-ru.org/files/bot/2019-03-04-x2.jpg
[12:52:44] <ada_ru> (Gourytch) печаль побайтной сортировки:
>>> 'е'.encode('utf8'); 'ё'.encode('utf8'); 'ж'.encode('utf8')
b'\xd0\xb5'
b'\xd1\x91'
b'\xd0\xb6'
>>>
[12:54:23] <ada_ru> (Gourytch)  отвечает (I_vlxy_I) на <надо таки на гошке е…>
на GWBASIC
[12:55:02] <ada_ru> (Максим) Ну, у нас есть матрёшка, она нормально сортирует
[12:55:04] <ada_ru> (I_vlxy_I) Это да. Юникот он такой. Его побайтово не посортируешь правильно.
[12:55:24] <ada_ru> (Gourytch)  отвечает (Максим) на <Ну, у нас есть матрё…>
и это хорошо.
[12:56:03] <ada_ru> (I_vlxy_I) И есть просто GNU sort, который всё может
[13:00:35] <ada_ru> (I_vlxy_I) В ходе разборок с сортировкой раста вчера, выяснилась особенность инфраструктуры языка: гуглишь какой-нибудь вопрос по расту, находишь хорошую статью, свежую (не старее пары лет), а примеры кода из статьи не компилируются.
[13:03:07] <ada_ru> (I_vlxy_I) Например отсюда: https://llogiq.github.io/2017/06/01/perf-pitfalls.html
[21:05:41] <ada_ru> (I_vlxy_I) https://imgs.xkcd.com/comics/goto.png
[21:06:00] <ada_ru> (I_vlxy_I) кстати, в Аде ведь использование goto не считается полным зашкваром?
[21:06:50] <ada_ru> (Максим) Ну можно, если нужно
[21:07:32] <ada_ru> (insert_reference_here)  отвечает (I_vlxy_I) на <И есть просто GNU so…>
В том числе в вменяемую сортировку по юникоду? Не верю
[21:07:38] <ada_ru> (Максим) Часто вместо continue; юзают
[21:07:46] <ada_ru> (I_vlxy_I)  отвечает (insert_reference_here) на <В том числе в вменяе…>
да
[21:08:03] <ada_ru> (I_vlxy_I) по кр. мере оно умеет учитывать локаль. растоверсии (любые) не могут в юникод
[21:08:09] <ada_ru> (I_vlxy_I) видимо у раста большие проблемы с юникотом.
[21:08:19] <ada_ru> (I_vlxy_I) как и с многопоточкой 😊
[21:08:33] <ada_ru> (insert_reference_here)  отвечает (I_vlxy_I) на <как и с многопоточко…>
А с многопоточностью-то что не так?
[21:09:16] <ada_ru> (I_vlxy_I)  отвечает (insert_reference_here) на <А с многопоточностью…>
ну, если бы она делалась на раз, то в том sort, что в uutils, многопоточность заюзали бы.
[21:09:48] <ada_ru> (insert_reference_here)  отвечает (I_vlxy_I) на <ну, если бы она дела…>
Многопоточная сортировка — в принципе занятие сложное
[21:10:19] <ada_ru> (I_vlxy_I) да ладно? на плюсах на раз реализовалось.
[21:10:25] <ada_ru> (insert_reference_here) А вообще вот:
https://docs.rs/rayon/1.0.3/rayon/slice/trait.ParallelSliceMut.html#method.par_sort
[21:10:36] <ada_ru> (insert_reference_here)  отвечает (I_vlxy_I) на <да ладно? на плюсах …>
И как же?
[21:10:43] <ada_ru> (I_vlxy_I) дык ручками!
[21:10:51] <ada_ru> (I_vlxy_I) пяток строк добавил и вуаля!
[21:12:37] <ada_ru> (insert_reference_here)  отвечает (I_vlxy_I) на <пяток строк добавил …>
Какие?
[21:13:01] <ada_ru> (I_vlxy_I) ну, один иф, пару тредов и джойнов
[21:13:18] <ada_ru> (I_vlxy_I) и ффсйо! масштабируется на любое число вёдер!
[21:13:29] <ada_ru> (insert_reference_here)  отвечает (I_vlxy_I) на <ну, один иф, пару тр…>
А как шарить будешь?
[21:13:50] <ada_ru> (I_vlxy_I) шарить каво? там всё естественным образом получается. мутехи не нужны.
[21:14:53] <ada_ru> (insert_reference_here)  отвечает (I_vlxy_I) на <шарить каво? там всё…>
Это если у тебя есть уверенность, что тред на перезатрёт кусок вектора соседнего треда
[21:15:03] <ada_ru> (I_vlxy_I) а так то, если вдруг есть более свежий, чем с++11, компиль, то можно и екзекушн полиси задать, что параллельно хочешь.
[21:15:47] <ada_ru> (I_vlxy_I)  отвечает (insert_reference_here) на <Это если у тебя есть…>
а кто ж ему даст? алгоритм сортироффки известен. итераторы определены. всё ясно и понятно 😊
[21:16:18] <ada_ru> (insert_reference_here) Я бы всё-таки хотел увидеть пример
[21:16:42] <ada_ru> (I_vlxy_I) доберусь до дома, скину. точнее даже на джихаб сложу.
[21:17:09] <ada_ru> (I_vlxy_I) ибо на джихабе я буду его допиливать - мне не очень нравится как балансится там нагрузка между тредами.
[21:17:54] <ada_ru> (I_vlxy_I) но еще раз - если в расте этого не сделали, значит там с многопоточкой и алгоритмами всё плохо.
[21:17:59] <ada_ru> (insert_reference_here)  отвечает (insert_reference_here) на <А вообще вот:
https:…>
Ещё раз
[21:18:01] <ada_ru> (I_vlxy_I) ибо это на поверхности вообще.
[21:18:21] <ada_ru> (I_vlxy_I)  отвечает (insert_reference_here) на <Ещё раз>
ну это ж даже не в стандартной либе!
[21:18:29] <ada_ru> (I_vlxy_I) и почему uutils этот район не заюзало?
[21:18:32] <ada_ru> (insert_reference_here)  отвечает (I_vlxy_I) на <ну это ж даже не в с…>
А нахрена оно там лодно быть?
[21:19:02] <ada_ru> (I_vlxy_I) потому, что такие алгоритмы - это то, что юзается часто. это ж базис.
[21:19:05] <ada_ru> (insert_reference_here)  отвечает (I_vlxy_I) на <и почему uutils этот…>
Потому что автор решил написать велосипед. У меня к его коду много претензий
[21:19:34] <ada_ru> (insert_reference_here)  отвечает (I_vlxy_I) на <потому, что такие ал…>
В том виде, которые они есть в плюсовой std-либе, они непрозрачны
[21:19:46] <ada_ru> (I_vlxy_I) в смысле?
[21:20:14] <ada_ru> (I_vlxy_I) в расте они типа прозрачны? настолько, что в uutils параллельную сортировку строк никто не осилил?
[21:20:47] <ada_ru> (insert_reference_here)  отвечает (I_vlxy_I) на <в расте они типа про…>
uutils вообще по приколу запилили, если я правильно понимаю
[21:20:48] <ada_ru> (insert_reference_here) RIIR
[21:22:04] <ada_ru> (I_vlxy_I) написано, что типо за ради кроссплатформенности.
[21:22:07] <ada_ru> (I_vlxy_I) но говно же 😊
[21:22:27] <ada_ru> (I_vlxy_I) ну, то есть и в плане производительности и в плане функционала.
[21:23:13] <ada_ru> (I_vlxy_I) и вон, пилить продолжают. судя по статистике коммитофф.
[21:23:57] <ada_ru> (insert_reference_here)  отвечает (I_vlxy_I) на <и вон, пилить продол…>
До сих пор?
[21:24:02] <ada_ru> (I_vlxy_I) угу
[21:24:33] <ada_ru> (insert_reference_here) Но вообще GNU-шный sort сколько лет разрабатывают уже — 40?
[21:25:10] <ada_ru> (I_vlxy_I) я плюсовый сорт чуть быстрее чем за 40 лет написал 😃 который рвёт растореализацию как тузик грелку.
[21:25:36] <ada_ru> (insert_reference_here) Плюс в uutils юзают стандартный алгоритм сортировки. А для эффективной сортировки строк требуется поменьше сравнений строк делать
[21:25:53] <ada_ru> (I_vlxy_I) а зачем они так делают?
[21:26:46] <ada_ru> (insert_reference_here) Пошли по пути наименьшего сопротивления, видимо
[21:28:19] <ada_ru> (I_vlxy_I) ну, то есть если говорить о качестве кода, то нужно смотреть не на растовые брульяты, которые специально обученные задроты написали и вылизали своим языком, а вот на такие проходные утилитки.

в среднем код будет вот такой. с такой вот производительностью.
[21:28:37] <ada_ru> (insert_reference_here)  отвечает (I_vlxy_I) на <ну, то есть если гов…>
Не факт
[21:28:54] <ada_ru> (insert_reference_here) Как бы не всегда в IO произвводительность кода упирается
[21:29:16] <ada_ru> (I_vlxy_I) а тут, кажется, и не в IO упирается.
[21:29:27] <ada_ru> (I_vlxy_I) если IO выкинуть целиком — оно все равно медленней плюсов.
[21:29:39] <ada_ru> (I_vlxy_I) (даже если у плюсов IO не выкидывать)
[21:30:12] <ada_ru> (I_vlxy_I) видимо у раста ручки, которые нужно покрутить для производительности, слишком далеко от программиста расположены. вот и всё.
[21:30:19] <ada_ru> (insert_reference_here) https://doc.rust-lang.org/stable/std/io/struct.BufWriter.html
[21:30:33] <ada_ru> (insert_reference_here) Как я и думал, буферизованый писатель тоже есть
[21:30:56] <ada_ru> (I_vlxy_I) есть. его можно заюзать. быстрее не будет.
[21:31:07] <ada_ru> (I_vlxy_I) но можешь модифицировать сниппет раста, я попробую затестить.
[21:31:19] <ada_ru> (insert_reference_here)  отвечает (I_vlxy_I) на <есть. его можно заюз…>
Почему?
[21:31:33] <ada_ru> (I_vlxy_I)  отвечает (insert_reference_here) на <Почему?>
я его, кажется, тестил
[21:32:03] <ada_ru> (I_vlxy_I) https://godbolt.org/z/NW5Ht3
[21:32:14] <ada_ru> (I_vlxy_I) вот болванка. модифицируй 😊
[21:32:31] <ada_ru> (I_vlxy_I) текущий, так сказать, state of the art сортировки на расте.
[22:00:55] <ada_ru> (insert_reference_here) Так должно быть побыстрее
https://godbolt.org/z/mC13MJ
[22:07:16] <ada_ru> (I_vlxy_I)  отвечает (insert_reference_here) на <Так должно быть побы…>
Спасибо. Потестирую.
[22:20:24] <ada_ru> (insert_reference_here) Вот ещё сортировка, заточенная именно под строки:
https://crates.io/crates/afsort
[22:23:40] <ada_ru> (I_vlxy_I) Надо будет пощупать этот алгоритм сортировки. Интересно, что у него с распараллеливанием.
[22:24:52] <ada_ru> (insert_reference_here)  отвечает (I_vlxy_I) на <Надо будет пощупать …>
Ничего
[22:25:31] <ada_ru> (I_vlxy_I) В смысле, ничего? Я вот тут смотрю: https://en.m.wikipedia.org/wiki/American_flag_sort
[22:25:51] <ada_ru> (I_vlxy_I) Ещё не успел подумать про параллелизм этого алгоритма.
[22:27:56] <ada_ru> (insert_reference_here) А, с алгоритмом
[22:28:02] <ada_ru> (insert_reference_here) Я прло реализацию
[22:28:19] <ada_ru> (I_vlxy_I) Ну, реализация это всегда такоэ...
[22:28:36] <ada_ru> (I_vlxy_I) Но ее можно быстро попробовать, это правда.
[23:41:47] <ada_ru> (I_vlxy_I)  отвечает (insert_reference_here) на <Так должно быть побы…>
да, быстрее. нагрузка на ядро упала, примерно 10 секунд выиграли.
была минута, стало 50 секунд: real    0m50.594s
[23:42:00] <ada_ru> (I_vlxy_I) (то есть sys был 9 секунд, стал 2)
[23:42:12] <ada_ru> (I_vlxy_I) меньше сисколов
[23:42:36] <ada_ru> (I_vlxy_I) но, конечно, один фиг медленней и стандартной сортировки и плюсцов. раза в полтора-два
[23:47:28] <ada_ru> (nitrocerber) Сортировка нинужна!
[23:47:35] <ada_ru> (nitrocerber) Вроде такого еще не было)
[23:47:52] <ada_ru> (I_vlxy_I) никогда такого не было и вот опять!
[23:48:06] <ada_ru> (I_vlxy_I) такс, теперь надо пощупать вериант сортироффки от Максима
[23:49:09] <ada_ru> (I_vlxy_I) а на какую кнопку в GPS сборка проекта вообще?
[23:49:17] <ada_ru> (nitrocerber) Ф4
[23:49:54] <ada_ru> (I_vlxy_I) а, сеньксь. там есть еще какой-то просто билд, про который не сказано
[23:50:11] <ada_ru> (I_vlxy_I) картинка https://www.ada-ru.org/files/bot/2019-03-04-x3.jpg
[23:50:18] <ada_ru> (nitrocerber) Шифт-Ф4 - коспильнуть текущее филе
[23:50:19] <ada_ru> (I_vlxy_I) Build All вот
[23:50:30] <ada_ru> (nitrocerber) Билд олл эт если у тебя мейнов нету
[23:50:38] <ada_ru> (nitrocerber) Библа там или типтого
[23:50:43] <ada_ru> (I_vlxy_I) а, ок
[23:50:48] <ada_ru> (nitrocerber) Ф4 строит пеовый мейн
[23:51:17] <ada_ru> (nitrocerber) Второй и далее ручками через меню. Я настраивал себе шифткеи на второй разве что, когда над связкой гпрбилд-гпрконфиг работад
[23:51:31] <ada_ru> (nitrocerber) Обычно один мейн у проекта всё-таки
[23:52:38] <ada_ru> (nitrocerber) А запустить - шифт Ф2
[23:53:17] <ada_ru> (I_vlxy_I) ну, я запускать комфортно могу только с терминала
[23:53:25] <ada_ru> (I_vlxy_I) у меня же stdin/stdout
[23:53:37] <ada_ru> (I_vlxy_I) перенаправления потоков в шеле
[23:53:48] <ada_ru> (I_vlxy_I) поэтому я и хочу всегда терминал в IDE
[23:54:06] <ada_ru> (I_vlxy_I) а терминал у GPS всё же ниочень, мягко говоря. но как-то пользоваться можно.
[23:54:12] <ada_ru> (nitrocerber) Это я хз, чо умеет жпсные консоли. Я обычно дальше простых репродьюсеров тож в консоли гоняю
[23:54:19] <ada_ru> (I_vlxy_I) GPS таки крашится при запуске htop там 😊
[23:54:36] <ada_ru> (I_vlxy_I) (GPS адакорный, 2018)
[23:55:03] <ada_ru> (nitrocerber) Кто такой хтоп я нинаю, неграмотный. Эт пущай Макс вывозит)
[23:55:27] <ada_ru> (I_vlxy_I) это он у вас главный по тарелочкам? 😊
[23:55:59] <ada_ru> (nitrocerber) Типтого
[23:56:58] <ada_ru> (nitrocerber) Главнее меня в области жпс уж точно) и в целом умнее
[23:58:02] <ada_ru> (I_vlxy_I) кажись Макс был прав - эта версия адской сортировки реально работает медленней.
[23:58:17] <ada_ru> (I_vlxy_I) уже 5 минут фигачит чото
[23:58:36] <ada_ru> (nitrocerber) Мож ушло в вц?)
[23:59:04] <ada_ru> (I_vlxy_I) да фиг знает.
[23:59:59] <ada_ru> (I_vlxy_I) хм. прикольно. вектор параметризуется функцией Swap. это очень правильно. мне нравится.