Alexander
по words а не lines
Dmitry
там это реально десятые доли, парсинг этот
Dmitry
я так написал, потому что проще. а не потому. что быстрее
Dmitry
и так и так делал, оставил как деталей меньше
Alexander
у тебя какой в итоге результат 2.03 мое vs сколько у тебя?
Alexander
я может если доберусь до этого ещё попробую чанки сделать как у тебя, должно поприличнее быть
Dmitry
2.03 это твоё, 2.318 - моё
Dmitry
твой вариант с парсингом, как у меня: dmz@zen ~/tmp/bsfuck $ time ./wtf < ./49zGQ6Zt.txt > /dev/null real 0m2.013s
Alexander
я решился включил ноут
Alexander
щас попробую такой же бамп сделать
Dmitry
короче, наши варианты отличаются - BS.hPutStr или Builder.hPutBuilder
Dmitry
первое чуть быстрее, если порезать на чанки правильного размера
Alexander
но вообще клёвый вариант для дефощтного алокатора
Dmitry
во втором чуть меньше кода
Alexander
по строке на слово из s у меня медленнее в 2 раза :/
Dmitry
обычному билдеру приходят кранты, когда он очень большой
Dmitry
поэтому если нарезать на n билдеров и выводить их, то работает ок даже без фастбилдера.
Dmitry
main = do (p,s) <- unzip . fmap (\[a,b] -> (a,b)) . chunksOf 2 . BS.words <$> BS.hGetContents stdin let wtf = map (\pref -> foldMap (mkb pref) s) p mapM_ (B.hPutBuilder stdout) wtf where mkb s1 s2 = B.byteString s1 <> B.byteString s2 <> B.char7 '\n'
Dmitry
надо как-то от unzip избавиться и конструирвоания тупла из списка
Alexander
с фастбилдером наоборот
Alexander
ему круто большим
Alexander
задавно
Alexander
чанки указывать ыаст-билдеру не обязательно
Alexander
в рамках погрешности разница
Alexander
хм на моём ноуте почти все выводит из текущего минимума
Alexander
может из-за того что проц поновее и т.п.
Alexander
ладно в любом случае я наверное доволен, надо бы в блоге сделать раздел с этими олимпиадками
Alexander
чтобы не терялись
Dmitry
а как тут вообще забороть GC ? может, не надо ему вообще работать?
Alexander
с выводами и открытыми вопросами и т.п.
Alexander
unboxed вектора надо
Dmitry
конечно, мелочи, но сколько-то долей секунды можно отыграть
Alexander
чтобы не работал
Dmitry
а просто ему нельзя сказать, что бы не работал? там памяти-то всего ничего используется, чего он
Alexander
или каждый раз поиск по строке делать
Alexander
-A256M
Dmitry
это только ухудшает
A64m
гц только в самом наивном варианте и работает, не все успевает вымирать, если а прибавить то все, не работает больше
Dmitry
не, ну там всё равно Gen 0 4972 colls, 0 par 0.038s 0.037s 0.0000s 0.0009s Gen 1 4 colls, 0 par 0.008s 0.008s 0.0019s 0.0036s
Dmitry
зачем нам они?
A64m
да это ничто просто
Dmitry
ну тут уже пошла рубка за десятые доли
Dmitry
осталось только написать на сях с miscdata
Dmitry
но что-то лень.
Alexander
можно как-то второй вектор сделать инлайнящимся?
Alexander
чтобы он каждый раз его заново строил
Alexander
да и первый тогда аллоцировать и хранить их не надо
Alexander
минимум тогда вариант @voidlizard с ifilter лучше
Dmitry
это который? где всё в вектор
Dmitry
?
Dmitry
надо было реп завести, что бы потом по коммитам историю мысли проследить
Alexander
где все вектор
Alexander
с unzip мы гарантировано почти аллоцируем вектора
Dmitry
но там неидеоматично
Alexander
по мне норм..
Dmitry
и отличается от питоновского алгоритма
Dmitry
там тоже можно тогда по индексам доставать
Dmitry
хм а может как в питоне сделать - за два прохода доставать
Dmitry
в общем, разница микроскопическая - переделал обратно на вектора и ifilter
Alexander
ifilter может круче быть даже, это логично будет
Dmitry
ладно, а почему у нас вообще билдер быстрее, чем просто байтстрока? что он там такого в себе делает
Dmitry
у меня почти без разницы
Alexander
можно ещё неидиматично и явный Stream сделать
Alexander
не надеясь на векторный, но это уже какой-то low level
Dmitry
stream -это на который тут выше ссылались?
Alexander
нет
Alexander
Data.Vector.Fusion.Stream
Alexander
так попробую ifilter сейчас сделать
Dmitry
по моему не там ищем.
Alexander
может улучшит мой вариант
Alexander
сейчас открыт вопрос стоит ли что искать вроде
Alexander
т.е. по хорошему сейчас надо честно профилировать (возможно даже системными тулзами), смотреть core и все такое
Alexander
но мне очень лень это делать
Dmitry
ну да, но это ж просто можно посмотреть сколько времени занимает построение байтстринга/билдера, и сколько вывод. честно профилировать как-то лень, это ж надо что
Dmitry
проект собирать, профилировочные библиотеки... брр
Alexander
да даже -ddump-all лень писать
Dmitry
хм, посчитать сумму длин строк - дольше, чем всё это вывести в /dev/null
Alexander
о чуть лучше получилось с ifilter
A64m
@voidlizard вероятно потому, что билдер не так давно появился и ленивые байтстроки в основном собираются просто как список, из тех чанков что есть
A64m
но это надо в коде смотреть