Dmitry
да, сек, покручу еще параметры
Dmitry
все равно WTF
Dmitry
https://gist.github.com/voidlizard/b53ff29e6ba55d1fb4dfcd6ed29ae6f1
Dmitry
каждый раз такие топики - унижение
Dmitry
хотя думаю, тут надо вправить мозги гарбажж коллектору
Dmitry
@A64m_qb0 не напомните опции - того, что в никнейме - достаточно?
A64m
увижу ли я когда-нибудь такой вопрос в интернетах, где бы от дефолтных настроек не было вреда хотя-бы на пару десятков процентов? Я и не надеюсь уже
Dmitry
распараллеливать тут нечего, т.к. сам список строится секунды за четыре (сумма длинн строк)
Dmitry
да потому что опции мутные. надо идти в проект смотреть нормальные, я голым ghc не помню даже как это делать
A64m
@voidlizard м никнейме для параллельного ГЦ так что много, для однопоточного случая достаточно разумных размеров A задать
Dmitry
что-то только хуже. вероятно, надо еще что-то сделать
A64m
но двадцать процентов тут погоды не делают конечно
Dmitry
что-то этот тут случай когда лучше работает с опциями по-умолчанию
A64m
у меня байтстринговый вариант от увеличения A работает не 55 где-то а 40
A64m
я не видел подифицированный вариант, может он меньше аллоцирует
A64m
да, в вашем варианте и так продуктивность под 100%
Dmitry
продуктивность?
Dmitry
в смысле, мало сидит в gc ? или мнго?
A64m
мало
eahqzsr
@voidlizard в двух словах, за счет чего ваша версия быстрее?
Dmitry
быстрее чего?
Dmitry
вот, кстати, еще чуть быстрее
Dmitry
https://gist.github.com/voidlizard/14cd8575e05f8bccc51b929dbd3c97a0
Dmitry
но в целом, я думаю что основное зло это hPutStrLn
Dmitry
и если выводить блоками, то будет чуть получше, сейчас чаю налью и проверю
A64m
@voidlizard а аппенд зачем?
Anonymous
думаешь внутри никакой буферизации нет?
A64m
не проще ли путСтр потом путСтрЛн
Dmitry
медленнее
Dmitry
вывод - putStrLn это основное зло
A64m
интересно
Dmitry
там или буферизация не алё, или еще что-то. сейчас проверю гипотезу
A64m
@eahqzsr версия быстрее потом у что там не собирается ленивый байтстринг, а просто цикл в стдаут печатает
Dmitry
надо его найти, я уже не помню, что там было
Dmitry
но думаю что да, list fusion \
Dmitry
и не собирается большая структура в памяти
A64m
ну она в памяти не накапливается
A64m
аллокации все равно большие, кстати, может forM_ с компрехеншеном не фьюзится.
Зигохистоморфный
traverse a <=< traverse b => traverse (a <=< b) такое фьюзится =)
eahqzsr
https://pastebin.com/rF5SDH7s
eahqzsr
Более чем в 2 раза быстрее.
Dmitry
нет ли тут принципиальной проблемы gc vs refcount ?
A64m
нет
A64m
ГЦ же никакого времени не тратит с первого вашего варианта
A64m
программа, которая ничего не делает только строку в стдаут 200000000 раз печатает, кстати, работает 26 секунд
A64m
т.е. да, кроме hPutStrLn ни на что время и не тратится фактически
A64m
main = do
hSetBuffering stdout (BlockBuffering (pure 4000000))
replicateM_ 200000000 $ BS.hPutStrLn stdout "fu7z2"
Dmitry
мне кажется, что тут дело в шедулере
Dmitry
и буферизации
Кабачок
@eahqzsr а все слова одинаковой длины?
Dmitry
например, putStr работает на 3 секунды быстрее putStrLn
eahqzsr
Вообще нет, 99% от 1 до 9 символов.
eahqzsr
Со средним в районе 4.
Кабачок
Хаскеллисты, получается concat. а потом putStr, быстрее чем несколько putStr?
Dmitry
вот это вот https://gist.github.com/voidlizard/2aa947068808891b2ad3cc148341d5d5 уже получается чуть быстрее питона, но
Dmitry
буферизация, причем, особо не влияла
Кабачок
@eahqzsr а верхний порог есть?
A64m
у меня бенчмарк hPutStrLn с дефолтными настройками буферизации немного побыстрее даже
eahqzsr
@voidlizard а инлайн тут нужен? Это ж парсинг входных данных, я правильно понимаю?
Dmitry
не, он бесполезен
Dmitry
но все равно - оно очень быстро делает это всё со строками, и очень медленно выводит
eahqzsr
Печально
Dmitry
ну, последняя версия работает чуть веселее, чем pypy, но на величину погрешности
eahqzsr
Спасибо, это уже кое-что.
Lev
а зачем putStr вместо какого-нибудь hWrite?
Dmitry
hWriteFile ?
Зигохистоморфный
есть вопросик)
Зигохистоморфный
https://gist.github.com/xgrommx/8da8b1b1c5f55081656ede665e80ab40#file-fix-hs-L45-L46
Lev
ну да
Dmitry
такого нет
Dmitry
есть WriteFile, можно попробовать его
Lev
там put что-то фееричное делает с юникодом, насколько помню
Lev
надо просто байты ссыпать, по возможности
Dmitry
не, тут вроде Char8
Dmitry
не должно быть ничего с юникодом
Dmitry
для LBS c writeFIle "/dev/null" стало хуже
Dmitry
т.е вот это вот
LBS8.writeFile "/dev/null" (LBS8.fromChunks all)
Dmitry
в два раза хуже, чем
mapM_ (BS8.putStr) all
Dmitry
тут конечно интересно, как поведут себя всякие пайпы/кондуиты