@kotlin_lang

Страница 916 из 982
Vladimir
05.10.2018
11:24:19
Google
Nameless
05.10.2018
11:26:08
кстати еще очень забавно что код с корутинами прогондируется как плоский и последовательный а по факту зачастую код в rxjava более плоским выглядит (еще накинул)



Egor
05.10.2018
11:26:41
OlegKrikun
05.10.2018
11:26:50
Alexandr
05.10.2018
11:26:52
не решается
да лан, даже в свинге и любой web фреймворке это есть, а в андройде - нет? так и поверил

Andrew
05.10.2018
11:27:27
кстати еще очень забавно что код с корутинами прогондируется как плоский и последовательный а по факту зачастую код в rxjava более плоским выглядит (еще накинул)
Код с корутинами пропогандируется как последовательный. Плоский != более читаемый, и rx это хорошо демонстрирует.

Nameless
05.10.2018
11:27:32
Handler же
да через handler можно debounce оформить, но когда начнешь еще операций навешивать то уже rxjava будет поудобнее

Nameless
05.10.2018
11:28:08
Код с корутинами пропогандируется как последовательный. Плоский != более читаемый, и rx это хорошо демонстрирует.
у меня с rx года три опосредственного опыта, отлично наверное поэтому читается ?

Mikhail
05.10.2018
11:28:09
Чет Елизаров в ранних докладах говорил среди плюсов корутин "не нужно запоминать кучу комбинаторов, как в rx" но он не говорил что для этого придется каждый комбинатор руками писать каждый раз

Andrew
05.10.2018
11:28:43
у меня с rx года три опосредственного опыта, отлично наверное поэтому читается ?
Именно — после трёх лет rx читается хорошо. Это был плюс, я понимаю? :)

Nameless
05.10.2018
11:29:03
Именно — после трёх лет rx читается хорошо. Это был плюс, я понимаю? :)
да, нужно теперь три года опыта с корутинами и смогу нормально сравнивать

Google
Alexandr
05.10.2018
11:29:18
да, не забывайте что у подхода корутин будет больше производительность

Mikhail
05.10.2018
11:29:22
Alexandr
05.10.2018
11:29:24
по крайней мере в теории

написать везде можно криво

Egor
05.10.2018
11:29:42
Господи, что вообще развели? Rx и корутины - два стула, вы садитесь на тот, на котором вам удобнее в той или иной ситуации. Зачем вам Rx, если все, что ваше приложение делает - ходит в сеть по одному запросу и сразу использует полученные данные?

Pavel
05.10.2018
11:29:44
кстати еще очень забавно что код с корутинами прогондируется как плоский и последовательный а по факту зачастую код в rxjava более плоским выглядит (еще накинул)
Так основная особенность, что континюэйшн пишешь последовательно, без колбэков. Да и не надо сравнивать с Rx, это разные вещи

Andrew
05.10.2018
11:29:58
А как rx джуна чиается, кстати? Нормальный последовательный код он обычно уже умеет писать сносно, а цепочки операторов складывать?

Alexandr
05.10.2018
11:30:09
И отсутствие блокировки
в этом и заключается производительность

Andrew
05.10.2018
11:30:27
Вот прям щас же Елизаров о простоте / читаемости говорил.

Andrew
05.10.2018
11:30:57
А много джунов с ФП бекграундом на рынке?

Или миддлов, раз уж на то пошло.

Mikhail
05.10.2018
11:31:24
неменого помогает сказать им что об ркс можно думать как о списке событий, но не синхронном а растянутом во времени

и что субскрайб - это форич

Andrew
05.10.2018
11:32:19
А ещё есть люди, которые годами пользуют рх для асинхронности, и считают, что они умеют в рх. С такими, я думаю, тоже работать, кгм, непросто поначалу.

Konstantin
05.10.2018
11:32:44
неменого помогает сказать им что об ркс можно думать как о списке событий, но не синхронном а растянутом во времени
Ниче, тут лайв-дата появилась, можно сказать "Как в лайвдата, только много чего можно сделать"

Mikhail
05.10.2018
11:33:23
Ниче, тут лайв-дата появилась, можно сказать "Как в лайвдата, только много чего можно сделать"
проще со списками аналогию проводить, потому что у них намного больше общего

Konstantin
05.10.2018
11:33:55
Ну да. Хотя stream api-то наверное уже многие знают

Google
Nameless
05.10.2018
11:33:55
Ну да. Хотя stream api-то наверное уже многие знают
лучше бы не знали, программы бы быстрее работали

Mikhail
05.10.2018
11:34:14
map, flatmap, zip - все это есть в списках но нет в лайвдате

Vladimir
05.10.2018
11:34:54
корутины не последовательный код, а те еще завороты, развороты
А какие завороты-развороты? Распараллелить процесс и собрать результат?

Nameless
05.10.2018
11:34:54
где пруфы?
ты серьезно?

Andrew
05.10.2018
11:35:26
корутины не последовательный код, а те еще завороты, развороты
В корутинах ради асинхронности достаточно расставить async / launch / withContext, форма остального кода сохранится +/-. Под rx переписывать придётся многое.

Mikhail
05.10.2018
11:35:26
ты серьезно?
да, меня интересуют замеры и _насколько_ быстрее они работают

Alexandr
05.10.2018
11:35:45
да, меня интересуют замеры и _насколько_ быстрее они работают
замеры говорят что стримы быстрее императивной записи с циклами и прочим

Vladimir
05.10.2018
11:36:45
И что? Что здесь такого страшного, количество закрывающих скобок? Декомпозицию никто не отменял. Логика совершенно последовательная.

Andrew
05.10.2018
11:36:50
От корутин тут один withTimeout и один delay, всё остальное — то, что было бы написать без корутин — обычный последовательный код.

Alexandr
05.10.2018
11:36:55
при некоторых случаях parallelStream дает прирост, но тут надо подходить очень с тонким тестированием

Mikhail
05.10.2018
11:37:18
В корутинах ради асинхронности достаточно расставить async / launch / withContext, форма остального кода сохранится +/-. Под rx переписывать придётся многое.
под rx достаточно добавить Completable/Single и обернуть код в лямбду. Если была не RxJava, а с самого начала на котлине писалось, то было бы launchComletable { doSomethingBLocking }

Andrew
05.10.2018
11:37:25
и один runblocking
Его с 1.3 с suspend main() не будет.

Nameless
05.10.2018
11:37:34
Руслан
05.10.2018
11:38:00
замеры говорят что стримы быстрее императивной записи с циклами и прочим
Нужно учитывать набор операций и размер коллекций

Google
Alexandr
05.10.2018
11:38:20
нет, только в случае параллезма
параллельные стримы не всегда быстрее - это раз, два - на стримах можно сделать дольше, тут есть ряд факторов, позволяющих стримам работать быстрее

Mikhail
05.10.2018
11:38:30
померь сам с jmh либо погугли
не я утверждаю, что реальная разница настолько большая, что лучше использовать всегда for вместо stream api

Alexandr
05.10.2018
11:38:37
Nameless
05.10.2018
11:38:39
еще вопрос накину что быстрее ArrayList<Lol> lols … for (Lol lol in lols) { } или for (int i = 0; i < lols.size; i++) { }

Andrew
05.10.2018
11:39:33
под rx достаточно добавить Completable/Single и обернуть код в лямбду. Если была не RxJava, а с самого начала на котлине писалось, то было бы launchComletable { doSomethingBLocking }
Ну если в launchCompletable спрятать создание сингла, назначение двух планировщиков и подписку — то да, примерно то же самое получается. Но так же обычно не делают, в rx важна сама цепочка, не?

Nameless
05.10.2018
11:39:41
Нужно учитывать набор операций и размер коллекций
большие коллекции с минимальным набором операций, мы же здесь измеряем циклы вс stream api

Andrew
05.10.2018
11:39:54
Сову тоже можно на глобус натянуть, конечно же.

Alexandr
05.10.2018
11:39:57
Нужно учитывать набор операций и размер коллекций
и тут даже не столько это эти параметры повлияют на параллельные стримы - однозначно обычные стримы дадут 100% выйгрыш, когда императивный код не может реализовать алгоритм без промежуточных коллекций

Mikhail
05.10.2018
11:41:16
Ну если в launchCompletable спрятать создание сингла, назначение двух планировщиков и подписку — то да, примерно то же самое получается. Но так же обычно не делают, в rx важна сама цепочка, не?
я про то что ты показываешь как простой случай на корутинах проще, потому что для него есть специальный оператор. Если у тебя полно простых случаев - то пара экстеншнов и хаер ордер функций и вперед

а в сложных случаях корутины пока какой-то кашей выглядят

Admin
ERROR: S client not available

Alexandr
05.10.2018
11:41:39
еще вопрос накину что быстрее ArrayList<Lol> lols … for (Lol lol in lols) { } или for (int i = 0; i < lols.size; i++) { }
в случае arraylist - примерно одинаково, если брать LinkedList - первый однозначно

Руслан
05.10.2018
11:41:54
и тут даже не столько это эти параметры повлияют на параллельные стримы - однозначно обычные стримы дадут 100% выйгрыш, когда императивный код не может реализовать алгоритм без промежуточных коллекций
Даже простые стримы имеют какую-то константу на инициализацию всей стримовой иерархии, поэтому например на 10 элементах пару промежуточных массивов могут быть даже быстрее

Andrew
05.10.2018
11:42:04
я про то что ты показываешь как простой случай на корутинах проще, потому что для него есть специальный оператор. Если у тебя полно простых случаев - то пара экстеншнов и хаер ордер функций и вперед
Я показываю, что простой случай на корутинах проще? Я всего лишь спорю с утверждением, что под rx не надо совершенно иначе перестраивать код.

Nameless
05.10.2018
11:42:09
в случае arraylist - примерно одинаково, если брать LinkedList - первый однозначно
неверно, arraylist через прямой доступ будет гораздо быстрее

Mikhail
05.10.2018
11:42:46
неверно, arraylist через прямой доступ будет гораздо быстрее
можно конкретику? гораздо - это сколько? 1нс? 1мс? 1с?

Nameless
05.10.2018
11:43:14
можно конкретику? гораздо - это сколько? 1нс? 1мс? 1с?
хз надо мерить, значения точные из бенчмарков не помню, думаю раза в два или около того

Alexandr
05.10.2018
11:43:20
неверно, arraylist через прямой доступ будет гораздо быстрее
далана? пруф с бенчмарком и результатами

Vladimir
05.10.2018
11:43:47
Сейчас бы foreach бенчмаркать

Google
Nameless
05.10.2018
11:43:48
Nameless
05.10.2018
11:44:36
тебя не будут считать пустословом)
ну ок, для меня конечно удивительно что вы не в курсе таких более менее базовых вещей

полез бенчмаркать

Георгий
05.10.2018
11:45:32
Alexandr
05.10.2018
11:46:15
А чего забыли про это? lol.forEach { /*...*/ } lol.asSequence().forEach { /*...*/ }
это котлин, сиквенс - это стрим из java, вид с боку

Nameless
05.10.2018
11:46:22
А чего забыли про это? lol.forEach { /*...*/ } lol.asSequence().forEach { /*...*/ }
ну можно много еще про что вспомнить конечно, но это уже другая история

Alexandr
05.10.2018
11:46:27
А чего забыли про это? lol.forEach { /*...*/ } lol.asSequence().forEach { /*...*/ }
кстати, первый вариант превратится в обычный цикл

Георгий
05.10.2018
11:47:01
Он inline?)

Alexandr
05.10.2018
11:47:07
да

Andrew
05.10.2018
11:48:18
не надо ничего перестраивать, говорю же, Completable.fromCallable { doSomething }.subscribe()
И как оно, часто в продакшн-коде такая конструкция встречается? Или всё-таки асинхронный код переписывается в код, работающий со стримами?

Andrey
05.10.2018
11:49:02
это котлин, сиквенс - это стрим из java, вид с боку
Котлин сиквенс - никак не стрим из джава. Сиквенс абстрагирует контекст обработки последовательности элементов. Стрим дополнительно ещё и контекст параллельной обработки, если он параллеьный.

Mikhail
05.10.2018
11:49:03
Andrew
05.10.2018
11:50:56
а корутины в продакшене тоже прям сразу launch или весь код переписывается на suspend?
Дык проставить модификаторы suspend для того, чтобы протянуть через функцию прерывания — это слегка отличное количество изменений в коде в сравнении с превращением всего и вся в обработку стрима. Нет?

Andrey
05.10.2018
11:51:14
если не учитывать параллельность как возможность джавового стрима - то тоже самое
Да, без параллельности - практически одно и то же. Хотя тоже не факт. У сиквенса не задекларировано, что по нему только один раз пробежать можно, насколько я помню. У стрима это так.

Andrew
05.10.2018
11:52:33
Для превращения кода в стримы моэно проставить возвращаемый тип
В смысле? Я могу взять обычный код, который циклы гоняет и прочими непотребствами занимается, написать, что он вощвращает не List<User>, а Flowable<User>, и всё будет хорошо? Я думал, rx не так работает.

Руслан
05.10.2018
11:54:05
Господи, бенчмаркать forEach по листам и сравнивать его со старым for с доступом по индексу. Тут в первую очередь нужно посмотреть в байт-код и убедиться что там один и тот же код сгенирировался, и перестать вообще думать о таких микрооптимизациях

Страница 916 из 982