Alexander
тут не списки против векторов
Alexander
но я удивлен
Dmitry
все равно непонятно, как жить. вот написал ты код, он как-то работает
Dmitry
откуда, в общем случае, тебе узнать, что оно тормознее pypy ?
Dmitry
написать заодно на pypy и устроить бенчмарк?
Dmitry
кстати, как работает pypy ? это что вообще такое?
Alexander
когда я пишу кож мне пофиг и.к. я убьюсь тоже самое на питоне писать
Alexander
и мне пофиг на скорость пока это не concern
Dmitry
ну вот эта вся история с байтстрингами - оно критично в серверах
Dmitry
например
Alexander
как только это становится проблемой, то меняю и меняб
Alexander
ну на серверах ты не будешь по 110000 байт в сеть дампать
Dmitry
ну тут же непонятно, это наш хаскель тормозит, или в какое-то фундаментальное ограничение уперлись
Alexander
там мне кажется хаскельный дефолт ближе к реальности
Alexander
и.е. там понятно за что платишь за IO manager и вроде оно и надо делать
Dmitry
а что сейчас слышно про кондуиты там всякие? оно актуально вообще? т.е по результатам прошлых специальных олимпиад я помню, что любой код, переписанный с кондуитами, как правило становится медленее
Dmitry
т.е мы тут даже не пытались задействовать ни их, ни пайпы, ни что там еще сейчас бывает - машины или как там их?
A64m
все стримы обычно медленнее лази ио, как иначе то?
A64m
их и придумывали не для скорости а для того чтоб вовремя файлы закрывать (с этим так и не удалось справится) и для того чтоб раньше времени ничего не закрылось (тут не все та плохо)
Alexander
машины - тормоза
Alexander
там нужно 10 авторов fast-builder чтобы их исправить
Alexander
я не рискнул взять стриминг
Alexander
и.к. в stdlib не нашел нужного, в планах попробовать streaming-bytestring
Alexander
но с другой стороны эта задача не очень выстраивается в pipeline
A64m
ио из стриминга, кстати, вообще выкинули
Alexander
stdinLn и stdoutLn есть
Alexander
ну и у меня он для интерфейсов к lmdb норм пошел
A64m
речь про новую версию, ее и не релизили вроде еще
Alexander
блин
A64m
у стриминга новые мейнтейнеры
Alexander
надо себе таску сделать посмотретл
Alexander
с другой стороны нормально
Alexander
ещё бы и string bullshit убрали
Alexander
а для этой задачи врятли взлетит хорошо, скорее какая-то тупость типа bytesting ,через вектора и append
A64m
там, кстати, отличный бенчмарк, иллюстрирующий, как здорово пайпы-кондуиты работаеют
copy 200M file divide it on lines,
adding '!' to each
lazy 0m0.813s 0m8.597s
streaming 0m0.783s 0m9.664s
pipes 0m0.771s 0m49.176s
conduit 0m1.068s 2m25.437s
Alexander
ну чтобы питонячий join получился
Alexander
почему там 2 времени?
A64m
тут похоже и в байтстринге наблюдаются тормоза от перечанкивания, видимо у читаемой байтстроки размер чанков нормаальный
A64m
два бенчмарка-то
Alexander
другое дело, что я боюсь что решения ускоряющие бенчмарк числодробильный ухудшат ситуацию в обычном случае
A64m
один просто читает и пишет, другой в коне каждой строки ! вставляет
Alexander
а понял
A64m
вставление тормозит байтстринг в 10 раз
A64m
явно что-то не в порядке
Alexander
+ malloc + copy + free + foreign ptr?
Alexander
но в 10 как-то плохо
A64m
да и скорость чтения записи не радует
Alexander
я вчера был удивлен, что использование низкоуровневой записи дало где-то процент к скорости
Dmitry
удивлен, что так мало? или так много?
A64m
выделение памяти и копирование со скоростью гигабайты в секунду работает, а пишет этот ужас со скоростью сотни мегабайт, этот восклицательный знак не должен быть заметен на этом фоне вообще, копируй-не копируй
Alexander
что так мало
A64m
да и даже самый тормозной поиск разделителя между строками не может так тормозить
Alexander
а это где такой бенчмарк?
A64m
https://github.com/michaelt/streaming-bytestring/blob/master/bench/benchlines.hs
Alexander
о круто пасиб
eahqzsr
а pypy в питоне это мейнстрим?
Ну если код на питоне 2 то если производительность не устраивает просто запускаешь его через pypy и иногда работает в несколько раз быстрее. Jit все-таки.
Dmitry
продолжаю извращения - выкидывание вектора из моего варианта никак не влияет на скорость
Dmitry
ну т.е влияет, но в пределах погрешности
Dmitry
в общем-то, вполне идеоматично в итоге.
Dmitry
но умнее ничего не придумывается. распараллеливание только всё портит
Dmitry
dmz@zen ~/tmp/bsfuck $ time ./bswtf4 < ./49zGQ6Zt.txt > /dev/null
real 0m2.295s
user 0m2.160s
sys 0m0.136s
dmz@zen ~/tmp/bsfuck $ time ./fu2.py < ./49zGQ6Zt.txt > /dev/null
real 0m4.613s
user 0m4.584s
sys 0m0.028s
Dmitry
кейс закрыт?
eahqzsr
Не, мне распараллеливание не нужно. Не нужна скорость любой ценой. Нагрузку на cpu к нулю устремить нужно.
Dmitry
она CPU грузит
Dmitry
но питон его тоже грузит на 100%
eahqzsr
Ну все грузит
eahqzsr
Это все же фаст билдер?
Dmitry
ну в моём вариате разница между Builder и FastBuilder мала.
Dmitry
можно и так, и так
Dmitry
самая быстрая - последняя версия @qnikst , но в моей последней код попроще
Dmitry
и чуть поменьше
Dmitry
main = do
v1 <- fmap (\[a,b] -> (a,b)) . chunksOf 2 . BS.words <$> BS.hGetContents stdin
let (p,s) = unzip v1
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'
A64m
разница мала, думаю, потому, что hPutBuilder у фастбилдера почему-то тормозной и это съедает все его успехи в других местах
Alexander
@eahqzsr моя вчерашняя версия все ещё самая быстрая
Alexander
с векторами и fast-builder-ом
Dmitry
но там разница в десятые.
eahqzsr
А если в mkb клеить строго байтстринг - медленнее будет?
Dmitry
щас попробую, но да
Alexander
мою можно ускорить если сделать парсить как у @voidlizard