Post #113
251
С момента своего появления в Java 8 Stream API сделал работу с коллекциями гораздо удобнее. Помимо большого количества утилитарных методов, он разделил все операции над коллекциями на промежуточные и терминальные. Тем самым стримы привнесли также концепцию "ленивых" (отложенных) вычислений. Действительно, зачем обрабатывать миллион элементов исходной коллекции, если заранее известно, что на выходе всегда берутся только два?
Kotlin под капотом использует те же самые java-коллекции, а вот вместо стримов предлагает очень похожую концепцию Sequence.
Поэтому вы наверняка задавались вопросом: надо ли вообще использовать обычные коллекции, если стримы/сиквенсы в теории должны быть более производительными? Этим же вопросом задались авторы доклада Непоследовательные последовательности на Joker 2024. И вот к каким выводам они пришли.
Обычные коллекции на самом деле всегда выигрывают у стримов и сиквенсов, если количество преобразований (например, map) над каждым элементом коллекции меньше 20. Это происходит за счёт инлайнинга компилятором и оптимизаций во время выполнения. Но если у вас в каждом элементе слишком много объектов или если кол-во преобразований больше 20, то инлайнинг перестаёт работать и ленивые вычисления начинают давать заметный профит.
Если же сравнивать между собой стримы и сиквенсы, то последние устроены чуть проще, а потому слегка проигрывают стримам. Происходит это за счёт того, что стримы учитывают некоторые признаки (например, признак сортировки) от предыдущей операции. А потому выполняют чуть меньше преобразований.
А как работаете с коллекциями вы?
Kotlin под капотом использует те же самые java-коллекции, а вот вместо стримов предлагает очень похожую концепцию Sequence.
Поэтому вы наверняка задавались вопросом: надо ли вообще использовать обычные коллекции, если стримы/сиквенсы в теории должны быть более производительными? Этим же вопросом задались авторы доклада Непоследовательные последовательности на Joker 2024. И вот к каким выводам они пришли.
Обычные коллекции на самом деле всегда выигрывают у стримов и сиквенсов, если количество преобразований (например, map) над каждым элементом коллекции меньше 20. Это происходит за счёт инлайнинга компилятором и оптимизаций во время выполнения. Но если у вас в каждом элементе слишком много объектов или если кол-во преобразований больше 20, то инлайнинг перестаёт работать и ленивые вычисления начинают давать заметный профит.
Если же сравнивать между собой стримы и сиквенсы, то последние устроены чуть проще, а потому слегка проигрывают стримам. Происходит это за счёт того, что стримы учитывают некоторые признаки (например, признак сортировки) от предыдущей операции. А потому выполняют чуть меньше преобразований.
А как работаете с коллекциями вы?
- 👍 4
- 🤔 1


















