Dmitry
v-stream
Dmitry
main :: IO () main = do ws <- BS8.lines <$> BS8.getContents let s = V.map (\v -> case BS8.words v of (a:_) -> a) $ V.fromList ws BSL.hPutStr stdout $ Builder.toLazyByteStringWith 110000 110000 $ foldMap (\suff -> V.foldr (\pref nx -> Builder.byteString suff <> Builder.byteString pref <> Builder.char8 '\n' <> nx) mempty (mkP ws)) s {-# NOINLINE mkP #-} mkP = V.map (\v -> case BS8.words v of (_:b:_) -> b) . V.fromList
A64m
а с foldMap вместо V.foldr медленнее что ли?
Anonymous
Задача реальная. Нужно кормить данными другую программу с минимальной загрузкой проца.
а можешь хотя бы примерно очертить бэкграунд или секрет? какая предметная область хотя бы?
Alexander
@A64m_qb0 на удивление да
доня.
а вопросы по purescript сюда задавать или есть отдельный чат?
доня.
короче, purs-loader для вебпака не запускает функцию main модуля, который прописан в entry с unsafePerformEff всё запускается это нормальная практика или всё-таки можно заставить вебпак/purs-loader запускать main самостоятельно
Dmitry
https://github.com/mersinvald/rust-vs-haskell-special-olimpiade/tree/stable
Dmitry
dmz@zen ~/tmp/bsfuck/rust-vs-haskell-special-olimpiade $ time ./target/release/rust-vs-haskell < ../49zGQ6Zt.txt > /dev/null read: 0.0 tokenize: 0.3 main: 1.383 real 0m1.391s user 0m1.384s sys 0m0.004s
Aleksei (astynax)
а вопросы по purescript сюда задавать или есть отдельный чат?
purescript - давно уже отдельный язык, так что лучше искать отдельное же сообщество (продуктивнее будет). И если на общие вопросы типа "как мне лучше поисать то-то на ATD?", или "а инстанс функтора для этого типа вообще нужен?" тут могут помочь с ответом, то в тюнинг webpack для пурсы тут мало кто умеет :) Можно ещё к тем же elm'ерам постучаться - эти хоть фронтендом занимаются и вебпаки пользуют (не все, к счастью)
Dmitry
https://twitter.com/voidlizard/status/922331703418478592
Dmitry
https://twitter.com/voidlizard/status/922334489224843264
Aragaer
по поводу читабельности - я могу раздербанить свой сишный код на отдельные функции с человеческими именами. А потом компилятор за меня все вернет как было.
Dmitry
эта
Dmitry
почитайте релиз: https://gist.github.com/voidlizard/c736e3d7fcd382c6f9904f8b653102b5
Dmitry
черт, опять моя рожа на снипете. как это побороть?
Dmitry
картинку же вставил
Dmitry
запись пока не публичная, но если возражений не будет, то запощу ссылку
Danila Matveev
могу еще скала-джава добавить, на моей тачке в районе 11сек тюнить ио я не умею, потребуется погружение отдельное зато сейчас оно читабельное)
Dmitry
надо с этим завязывать, могу просто вставить ссылки, но бенчмаркать джаву я не готов
Dmitry
у себя
Dmitry
если есть желание добавить ссылку на Java - давай ссылку, я вставлю в пост
Danila Matveev
https://gist.github.com/optician/830cb8fe1212eae055ec9fdfb1cd78a8
Anonymous
почитайте релиз: https://gist.github.com/voidlizard/c736e3d7fcd382c6f9904f8b653102b5
имо раст победил по скорости первого пришедшего в голову кода
Alexander
3s?
Dmitry
3s
Anonymous
да
Anonymous
а питон 4
Dmitry
ну, тут такое - что 6 строк питона или 10 значимых (без импортов) хаскелла в голову придут, я еще как-то верю. но по 50 срок за раз мне в голову уже не приходит, но ок, пусть так
Dmitry
раст же все равно победил
Dmitry
это, кстати, хорошо
Dmitry
спасибо что не си
Alexander
у меня сейчас раст обногяет сишку
Alexander
что удивительно
Dmitry
сраный си должен давно умереть
Dmitry
году бы в 82-ом
Dmitry
1982
Dmitry
тогда б глядишь и плюсов бы не было
Alexander
блин что-то у меня сегфолт на ровном месте
Alexander
хаха
Alexander
-foptimize-strlen + -fcse-follow-jumps и привет сегфолт
Зигохистоморфный
а есть все варианты как в одно гисте с разными файлами?)
Кабачок
все таки надо сделать сишку на mmap
Alexander
а что там ммапать то?
Alexander
можно в анонимный файл писать stdin разве что
Кабачок
можно stdin ммапнуть и таким образом избавится от копирования
Alexander
куда копирования?
Кабачок
хотя интернеты говорят что так лучше не делать
Ilya
Только имхо, сравнивать надо не md5(out), а md5(sort(out))
Ilya
В исходном ТЗ по-моему про порядок ничего не было
Кабачок
в сишной версии же считывается ввод и пишется в буфер?
Ilya
А так вы уменьшили простор для оптимизаций
Dmitry
@qnikst чего? в моей сишной версии токены копируются
Dmitry
сначала генерится strchunk - список строк для каждого токена. потом в emit_token копируются в целевой буфер
Dmitry
@Masteroid вывод квадратичен от входа. на бОльших входных данных эта метрика умрёт
Ilya
А зачем сравнивать на больших?
Ilya
На маленьких сверяете output, на больших тестите уже скорость
Dmitry
ну потому, что быстро работать на маленьких данных, и кровь-кишки-мозги-по-стенам - это типичное поведение нашего хаскела
Dmitry
надо, что бы на любых работало
Dmitry
нормально
Dmitry
без неожиданного жора памяти и тп
Dmitry
поэтому мы и писать всё в большой выходной буфер запрещаем в этой олимпиаде
Alexander
ну у меня например ничего не копируется
Dmitry
в си или хаскеле?
Alexander
нужно только токенизацию получше сделать и вектор длин хранить
Alexander
си
Dmitry
я ну я про свою версию пишу,
Alexander
я спросил про mmap
Dmitry
если есть дополнение про твою версию - давай ты напишешь и вставим абзац
Alexander
я не придумал куда его прикрутить
Alexander
не, все норм тем более моя версия там вроде есть последняя рабочая
Alexander
ну или почти последняя но там мелочи
Alexander
не понимаю почему у меня сегфолты : (
Alexander
надо видимо хацкели работать а не си
Aragaer
у меня последние сегфолты были, когда я принялся массово переименовывать переменные и в итоге в какой-то момент начал терять свой собственный буфер, когда в переменную-указатель-на-буфер стал присваивать промежуточные результаты
Ilya
ну потому, что быстро работать на маленьких данных, и кровь-кишки-мозги-по-стенам - это типичное поведение нашего хаскела
Это понятно, но можно же сравнивать корректность выхода на небольших входах, а сравнивать времена работы уже на больших. Впрочем, дело ваше.
Dmitry
ну это ж гиморой, а ради чего?