Dmitry
хм...
Alexander
а можешь вторую версию питона попробовать
Alexander
там была ускоренная
Alexander
щас найду
Alexander
через join
Dmitry
ну вот оно у меня прямо как есть работает в два раза лучше pypy
Alexander
Alexander
а не
Dmitry
может, он плох был по стрейсу?
Alexander
Alexander
по времени
Dmitry
там питоновое что-то
Alexander
да это более быстрая питоновая версия
Alexander
с которой я сравнивал
Dmitry
ну у меня вроде такая же
Alexander
в гисте другая
Alexander
я hPut смотрел у fast-builder-п
Alexander
он там был хуже чем кастомные настройки размера чанков
Dmitry
а. да, это опять быстрее, но тут есть нюанс
Alexander
и ради интереса моя версия за сколько отрабатывает?
Dmitry
я ж вернул субоптимальный парсинг
Alexander
с векторами и fast-builder
Alexander
кстати я думаю питон собирает строгий байтстринг
Alexander
ну аналог
Alexander
в итоге у него 110000/32678 раз меньше вызовов write
Alexander
*2
Alexander
у Haskell ещё и + poll
Alexander
но это всё мелочи, т.к. ещё gc
eahqzsr
Ну у питона полюбому строки строгие. Других нету.
eahqzsr
Сдаётся мне, что придётся запилить бенчмарк.
Kirill
А не пробовали этот код в eta прогнать? Там бы и jit от жвм из коробки был
Kirill
Заодно бы узнали какие перспективы у хаскеля в жвм
Alexander
зачем бенчмарк, чего бенчмарк?
Aleksei (astynax)
JIT тут не особо поможет, ИМХО, ибо тормозит IO.
Alexander
у еты никаких, используйте inline-java
Alexander
нет
Alexander
GC тоже
Alexander
и уже обогнали
Alexander
jit может помочь чанки лучше в fd отдавать и все
Alexander
и то не факт
Anonymous
а с luajit сравните плз, либо я сам когда дома окажусь
Dmitry
да, короче вообще все, что не относится к IO тут неважно
Dmitry
хоть как парси
Dmitry
хоть где храни
Dmitry
вектор, список...
Anonymous
серьезно? @qnikst вчера наоборот говорил
Dmitry
ну, с некоторыми оговорками. у меня версия на списках примерно так же работает, как и на векторах
Dmitry
т.е основное - это как оно потом выводится.
Alexander
ну у меня на списках 4с
Alexander
на векторах 1.5
Dmitry
вот например - довольно быстро, но всё равно медленно:
main = do
v1 <- V.fromList . BS.words <$> BS.hGetContents stdin
let p = V.ifilter (\i _ -> even i) v1
let s = V.ifilter (\i _ -> odd i) v1
hSetBinaryMode stdout True
hSetBuffering stdout (BlockBuffering (Just 10485760))
forM p $ \pref -> do
let zu = foldMap (\x -> mkb pref x) s
B.hPutBuilder stdout zu
where
mkb s1 s2 = B.byteString s1 <> B.byteString s2 <> B.char7 '\n'
Alexander
3с на списках
Alexander
но чтобы это сделать нужно решить все проблемы с IO
Anonymous
@voidlizard @qnikst а ОС у вас какие?
Alexander
nixos
Dmitry
да это без разницы же
Alexander
ну винда бы дала отличие
Dmitry
setBinary у меня ни на что не влияет, равно как и BlockBuffering
Anonymous
почему тогда настолько результаты разные?
Dmitry
ну я на ноуте делаю, ноут старый
Alexander
@voidlizard ты мою версию запускал?
Dmitry
ползти к рабочему месту лень.
Dmitry
сейчас твою запущу
Dmitry
а скинь её еще раз плс
Alexander
блин я на телефоне
Dmitry
эта - https://gist.github.com/qnikst/a06ebe89274fd56b58372e3f9e37ba76 ?
Alexander
да похода
Alexander
похожа
A64m
@stupidwasteofspace решением проблем с ИО ускорили с 50 до 4, а всем остальным с 4 до 1.5 так что все из-за ИО не особенно большое преувеличение
Dmitry
fast-builder же стрёмный?
Alexander
хорошо у меня работал
Dmitry
в два раза быстрее, чем у меня и чем питон
Alexander
@stupidwasteofspace ну вон похоже результаты сходятся
Alexander
вообще если хочется правильное быстрое и хорошее решение то это будет c-like с картами отступов mmap и прочей ерундой
Dmitry
короче, мораль в чем - в putStr понасовали poll-ов ?
Alexander
может даже будет работать для данных не влезающих в память
Alexander
@voidlizard не
Dmitry
стандартный билдер лучше, чем вручную склеивать байтстроки, надо его использовать
Alexander
как только сделали большие чанки и решили проблемы с ИО