Dmitry
но это уже реально на любителя, ну и как правило наивное использование кондуитов приводит только к тормозам
Dmitry
тут конечно опять такое дело - питон небост большую часть времени проводит в сишных реализациях
Dmitry
и gc там небось рефкаунт
Dmitry
но это опять разговоры в пользу бедных, да?
Dmitry
алсо там еще что-то мутит шедулер с вводом выводом
A64m
я думаю, если килобайтные чанки собирать и их путстрингать то быстрее будет
Dmitry
только что пробовал, шляпа.
Dmitry
но, возможно это надо делать аккуратнее
Dmitry
почему не работают опции gc: 5 MB total memory in use (0 MB lost due to fragmentation)
Dmitry
а есть у нас для ввода-вывода что-то получше, чем ByteString ?
A64m
вот такой вот вариант первоначальной программы работает почти так же быстро как ручная оптимизация
A64m
import qualified Data.ByteString.Lazy.Char8 as B import qualified Data.ByteString.Builder as Builder import Data.Foldable (fold) import Data.Monoid ((<>)) main :: IO () main = B.interact processAll processAll = Builder.toLazyByteString . fold . process . unzip . map toPairs . B.lines process (l1, l2) = [Builder.lazyByteString e1 <> Builder.lazyByteString e2 <> Builder.char8 '\n' | e1 <- l1, e2 <- l2] toPairs line = (el1, B.tail el2) where (el1, el2) = B.break (== ' ') line
A64m
и я думаю потому, что билдер старается чанки побольше делать, если я правильно помню
A64m
да в том и дело, что лучше байтстринга нету ничего, разве что какие-то эксперименты в новых прелюдиях типа stdio и foundation
eahqzsr
Да, тут видимо проблема в том что строки мелкие и их много.
Alexander
решили?
A64m
нет
Alexander
я все не могу понять хочу ли я лечь спать или таки ввязаться в спецолимпиаду
eahqzsr
Ну что смотря считать "решили"
Alexander
пока таблетка от головы не начала действовать я склоняюсь к спать, но может и впишусь
eahqzsr
Ускорили раза в 3, да.
A64m
c A16m мой код выше 8 сек работает (первоначальная версия 55)
A64m
разве что может он неправильный файл генерит
Alexander
а какая версия последняя?
Alexander
ок тогда сына уложу попробую тоже что придумать
Dmitry
спец. олимпиады это увлекательно, но на трень надо ехать.
Dmitry
можно начать отсюда https://gist.github.com/voidlizard/2aa947068808891b2ad3cc148341d5d5
A64m
нет вроде на правильный похож
Alexander
на putStrLn заменить можно?
Alexander
а то присобачивание символа с копированием строки
A64m
в том и смех, что быстрее с присобачиванием
Dmitry
Тормознее
Alexander
фигасе
Alexander
надо код посмотреть..
A64m
проверьте кто-нибудь мой, он что-то подозрительно сносно работает
Alexander
вы через час примерно ту и будете? я тогда с компа все посотрю
eahqzsr
Я точно буду
A64m
я буду
Alexander
ещё words <$> меня всегда пугает
Alexander
я в хаккерранке часто ошибался и оно вычисление выносило и повторяло
A64m
да тут парсинг первого небольшого файла вообще погоды не делает
Alexander
а где все, на выводе?
A64m
да
Alexander
хо-хо
Alexander
а буфферинг поменять?
A64m
предполагаю, что главное собирать строки в достаточно большие куски, чтоб накладные расходы на ио уменьшить
Alexander
со строкового на страничный?
Alexander
или так не честно?
A64m
да, измеряли с буыерингом 4мб блоками
Alexander
и как?
A64m
да без особого результата
A64m
если сборка билдером помогает, то тут еще есть что поисследовать, есть билдеры побыстрее байтстрингового
eahqzsr
Да, хорошо работает. Только размер строки которую билдер строит великоват как мне кажется.
A64m
в смысле?
A64m
$ cat 49zGQ6Zt.txt | bs +RTS -A64m -s -RTS > /dev/null 29,258,092,824 bytes allocated in the heap 5,158,088 bytes copied during GC 1,736,984 bytes maximum residency (2 sample(s)) 209,304 bytes maximum slop 74 MB total memory in use (2 MB lost due to fragmentation) Tot time (elapsed) Avg pause Max pause Gen 0 420 colls, 0 par 0.016s 0.017s 0.0000s 0.0039s Gen 1 2 colls, 0 par 0.000s 0.001s 0.0006s 0.0011s INIT time 0.000s ( 0.001s elapsed) MUT time 7.812s ( 8.865s elapsed) GC time 0.016s ( 0.018s elapsed) EXIT time 0.000s ( 0.000s elapsed) Total time 7.828s ( 8.884s elapsed) %GC time 0.2% (0.2% elapsed) Alloc rate 3,745,035,881 bytes per MUT second Productivity 99.8% of total user, 99.8% of total elapsed
eahqzsr
Размер чанка великоват
A64m
он по идее должен десятки кб быть, максимум резиденси тут вообще из вычитанного первого файла складывается
Alexander
4096+32кб
Alexander
можно ещё ленивую бпйтостроку собрать
Alexander
и мои hPut прогнать
A64m
я ленивую и собираю
Alexander
который копипаста из base неэкспортированных функций
Alexander
ещё можно посмотреть что в unix
Alexander
и.к. все эти hPut не на прямую идут
A64m
есть же всякие новые эксперименты с написанным с нуля ИО, я никогда к ним не присматривался
Alexander
но это какой-то изврат, да?
Dmitry
Неидиоматично
A64m
наверное
Alexander
я ничего живого и хорошего не видел
Alexander
обычно все поверх того что в base но типакруче
Alexander
ок, я за компом
Alexander
итак какие файлики брать для тестов?
Alexander
гист @voidlizard вижу
A64m
последний мой https://t.me/haskellru/48135
Alexander
а файл для тестов?
Alexander
исходник т.е.
Alexander
т.е. данные
Danila Matveev
@odomontois ты как-то рассказывал, что в контестах переписывают хаскелевый ввод-вывод из-за перформанса это не тот кейс?
A64m
https://pastebin.com/49zGQ6Zt