Size: a a a

Kotlin Community

2020 December 30

ВМ

Валерий Маевский... in Kotlin Community
Alexander Nozik
Такие вещи оптимизировать без острой нужды и явных замеров очень-очень не рекомендуется
то есть в случае sealed class идёт просто линейный перебор с instanceof?
не очень понятно, почему не рекомендуется оптимизировать, что тут можно сделать хуже?
источник

AN

Alexander Nozik in Kotlin Community
Валерий Маевский
то есть в случае sealed class идёт просто линейный перебор с instanceof?
не очень понятно, почему не рекомендуется оптимизировать, что тут можно сделать хуже?
Вы знаете что такое преждевременная оптимизация? Вот это она. Ботлнек на when-is будет примерно в одном случае на миллион (повторюсь, речь про JVM). А преждевременной оптимизацией этого момента, вы можете себе сильно испортить код. В JVM именно перебор по типам очень сильно оптимизирован.
источник

A

Aleksandr in Kotlin Community
Oleg Yukhnevich
https://pl.kotl.in/lAXbvCzbS
типа так - даже лучше, единственное, что здесь создаётся итератор по каналу и обрабатывается нормально закрытие канала
Спасибо
источник

ВМ

Валерий Маевский... in Kotlin Community
Alexander Nozik
Вы знаете что такое преждевременная оптимизация? Вот это она. Ботлнек на when-is будет примерно в одном случае на миллион (повторюсь, речь про JVM). А преждевременной оптимизацией этого момента, вы можете себе сильно испортить код. В JVM именно перебор по типам очень сильно оптимизирован.
я скорее не про оптимизацию в коде (второй способ использовал только в java, потому что непонятно, насколько перебор по типам оптимизирован в dalvik, а tableswitch скорее всего), а про результат работы компилятора
источник

AN

Alexander Nozik in Kotlin Community
Валерий Маевский
я скорее не про оптимизацию в коде (второй способ использовал только в java, потому что непонятно, насколько перебор по типам оптимизирован в dalvik, а tableswitch скорее всего), а про результат работы компилятора
А не надо тут думать, надо мерить. И результат работы компилятора вы можете отлично посмотреть.
источник

ВМ

Валерий Маевский... in Kotlin Community
поразвлекаюсь на досуге тогда
jmh для замеров же подходит в данном случае?
источник

AN

Alexander Nozik in Kotlin Community
Валерий Маевский
поразвлекаюсь на досуге тогда
jmh для замеров же подходит в данном случае?
Да, главным образом он и подходит. Но можете просто запустить с профайлером. Вам надо не скорость конкретного места проверять, а смотреть, как оно влияет в целом на ваш код.
источник

AN

Alexander Nozik in Kotlin Community
Нет смысла экономить 10% производительности на коде, который занимает 0.001% общего времени
источник

IP

Iaroslav Postovalov in Kotlin Community
Валерий Маевский
поразвлекаюсь на досуге тогда
jmh для замеров же подходит в данном случае?
kotlinx-benchmark?
источник

IP

Iaroslav Postovalov in Kotlin Community
его кое-как поддерживают даже
источник

IP

Iaroslav Postovalov in Kotlin Community
раз в полгода
источник

V

Vladimir in Kotlin Community
Валерий Маевский
то есть в случае sealed class идёт просто линейный перебор с instanceof?
не очень понятно, почему не рекомендуется оптимизировать, что тут можно сделать хуже?
sealed классы дают очень крутую гарантию, что когда ты экспортируешь их в апи и пользователи делают
when (a) { is B -> ... } без else, то при добавлении новых подклассов код не скомпилируется без правок. Тем самым можно обеспечивать корректность обработки
источник

ВМ

Валерий Маевский... in Kotlin Community
Vladimir
sealed классы дают очень крутую гарантию, что когда ты экспортируешь их в апи и пользователи делают
when (a) { is B -> ... } без else, то при добавлении новых подклассов код не скомпилируется без правок. Тем самым можно обеспечивать корректность обработки
Это-то понятно, но казалось бы, можно воткнуть и tableswitch за почти бесплатно (как у того же Enum)
источник

IP

Iaroslav Postovalov in Kotlin Community
Валерий Маевский
немного отвлечённый вопрос
sealed class A { class B: A; class C: A; class D: A }
и when (a) { is B -> fB(a); is C -> fC(a); is D -> fD(a) }
работает так же быстро, как
abstract class A(val tp: Int) { class B: A(1); class C: A(2); class D: A(3) }
и when (a.tp) { 1 -> fB(a as B); 2 -> fC(a as C); 3 -> fD(a as D) }
?
во-первых, я себе глаза сломал, разбирая этот код на стейтменты. во-вторых, лучше сразу делать бенчмарки конкретного рантайма
источник

V

Vladimir in Kotlin Community
это я к тому, что раз jmh вообще появился тут, то скорее всего ради такого use case он и был взят? :)

По-существу конечно jmh показать может
источник

с#

саша сок #KotlinGang... in Kotlin Community
Валерий Маевский
немного отвлечённый вопрос
sealed class A { class B: A; class C: A; class D: A }
и when (a) { is B -> fB(a); is C -> fC(a); is D -> fD(a) }
работает так же быстро, как
abstract class A(val tp: Int) { class B: A(1); class C: A(2); class D: A(3) }
и when (a.tp) { 1 -> fB(a as B); 2 -> fC(a as C); 3 -> fD(a as D) }
?
это что-то типа использовать @IntDef вместо enum class ?
источник

ВМ

Валерий Маевский... in Kotlin Community
саша сок #KotlinGang
это что-то типа использовать @IntDef вместо enum class ?
что-то типа, но с @IntDef логика была в том, что от этих перечислений кроме самого факта, что это перечисление, ничего не требовалось, а ресурсы (память) расходовались впустую при обычных enum
источник

с#

саша сок #KotlinGang... in Kotlin Community
Валерий Маевский
что-то типа, но с @IntDef логика была в том, что от этих перечислений кроме самого факта, что это перечисление, ничего не требовалось, а ресурсы (память) расходовались впустую при обычных enum
имхо это экономия на копейках, которая почти никогда не поможет
источник

I

Ilmir in Kotlin Community
Alexander Nozik
Да, главным образом он и подходит. Но можете просто запустить с профайлером. Вам надо не скорость конкретного места проверять, а смотреть, как оно влияет в целом на ваш код.
А jmh разве умеет в ART?
источник

AN

Alexander Nozik in Kotlin Community
Ilmir
А jmh разве умеет в ART?
Нет, но я же специальо сказал, что надо тестировать не конкретно этот участок, а приложение
источник