Size: a a a

Kotlin Community

2020 July 31

AS

Andrey Stepankov in Kotlin Community
Eugene P.
Есть ли возможность в kotlin Flow делать аналог bufferTime из RxJava, или опять что-то колхозить надо?
https://rxmarbles.com/#bufferTime

Нашел issue https://github.com/Kotlin/kotlinx.coroutines/issues/1302, но его закрыли, почему-то
А не получится через sample такое провернуть?
источник

EP

Eugene P. in Kotlin Community
Andrew Mikhaylov
По-моему связанное со временем ещё пока всё только в планах.
Какая боль. Думал легко и просто выкину Rx и прокачаюсь в Flow, но любое мало мальски нестандартное требование и тут же натыкаешься на такие заборы
источник

AS

Andrey Stepankov in Kotlin Community
https://flowmarbles.com/#sample
вроде так же работает
источник

EP

Eugene P. in Kotlin Community
Andrey Stepankov
https://flowmarbles.com/#sample
вроде так же работает
Там последний элемент выдает, а не все элементы полученные за период списком
источник

AS

Andrey Stepankov in Kotlin Community
Все так. Но можно же что-то вроде

source.toList().sample()
источник

AM

Andrew Mikhaylov in Kotlin Community
Так toList терминальный же
источник

AS

Andrey Stepankov in Kotlin Community
Andrew Mikhaylov
Так toList терминальный же
А точно.
источник

EP

Eugene P. in Kotlin Community
Да, тоже полез документацию смотреть на toList
источник

AM

Andrew Mikhaylov in Kotlin Community
Есть подозрение, что это несложно наколхозить с combine* и самопальным ticker-ом, сделанным на while(isActive) + delay(...), но не берусь колхозить сам.
источник

AM

Andrew Mikhaylov in Kotlin Community
Ну или даже просто слизать реализацию sample, заменив там lastValue на сбор списка.
источник

EP

Eugene P. in Kotlin Community
Andrew Mikhaylov
Есть подозрение, что это несложно наколхозить с combine* и самопальным ticker-ом, сделанным на while(isActive) + delay(...), но не берусь колхозить сам.
Тут человек как-то так и сделал, вроде
https://dev.to/psfeng/a-story-of-building-a-custom-flow-operator-buffertimeout-4d95
источник

EP

Eugene P. in Kotlin Community
Andrew Mikhaylov
Ну или даже просто слизать реализацию sample, заменив там lastValue на сбор списка.
В sample поливина внутренностей помечено как internal, больно много копипастить придется
источник

AM

Andrew Mikhaylov in Kotlin Community
Я видел. Увы. Зато со временем можно будет деприкейтить и выбрасывать)
источник

EP

Eugene P. in Kotlin Community
Andrew Mikhaylov
Я видел. Увы. Зато со временем можно будет деприкейтить и выбрасывать)
Зато неудобно тем, кто хочет делать какие-то расширения
источник

AM

Andrew Mikhaylov in Kotlin Community
Eugene P.
Зато неудобно тем, кто хочет делать какие-то расширения
Не, я о том, что вы сможете со временем деприкейтить и выбрасывать скопипащенное, когда оно будет появляться в публичном интерфейсе либы)
источник

EP

Eugene P. in Kotlin Community
А, я не так понял, извините
источник

OY

Oleg Yukhnevich in Kotlin Community
@noraltavir
в общем, попрофайлил ещё раз, с более-менее одинаковым кодом
java имплементация быстрее:
requestResponse: в 1.2 раза
requestStream: в 2.7 раза
requestChannel: в 2.4 раза
не пробовал делать что-то с buffer pool io, потому что там много expect/actual и internal api, не так много времени на это
так что, не в 10 раз, но в 2-3 раза медленнее
это уже думаю можно по большей части списать на мой код + на IO
источник

AN

Alexander Nozik in Kotlin Community
Oleg Yukhnevich
@noraltavir
в общем, попрофайлил ещё раз, с более-менее одинаковым кодом
java имплементация быстрее:
requestResponse: в 1.2 раза
requestStream: в 2.7 раза
requestChannel: в 2.4 раза
не пробовал делать что-то с buffer pool io, потому что там много expect/actual и internal api, не так много времени на это
так что, не в 10 раз, но в 2-3 раза медленнее
это уже думаю можно по большей части списать на мой код + на IO
Ну 2-3 это не фатально. Но надо бы понять, почему так.
источник

OY

Oleg Yukhnevich in Kotlin Community
Alexander Nozik
Ну 2-3 это не фатально. Но надо бы понять, почему так.
быстрый профайлинг CPU привёл к наибольшей нагрузке при конвертации фреймов (то есть IO часть)
но, я не спец в работе с IO, так что мог просто не очень это заимплементить
позже гляну глубже, что там может быть
источник

KT

Kirill Timofeev in Kotlin Community
Oleg Yukhnevich
быстрый профайлинг CPU привёл к наибольшей нагрузке при конвертации фреймов (то есть IO часть)
но, я не спец в работе с IO, так что мог просто не очень это заимплементить
позже гляну глубже, что там может быть
а чем, кстати, профайлил?
источник