Size: a a a

2020 April 13

MZ

Maxim Zinchenko in Kotlin Moscow
Для этого придётся доводить код до библиотечного. Нет же цели сделать универсальное решение. Кроме того, есть проблемка, что у нас например одни extension тянут другие ну и так далее, набегает уже на github репо, а не на пример кода. Это связано в том числе с тем, что если начинаешь пилить что-то своё, то приходится опускаться до низкого уровня. К kotlin runtime полно претензий вроде не только у меня, это просто детская болезнь, будем ждать верить и надеяться, что все наши велосипеды из костылей удастся выкинуть, как только появятся готовые универсальные решения. Например, эффективные иммутабельные коллекции. К sequence как раз меньше всего претензий, потому что в нём почти ничего нет. А как только что-то чуть более сложное начинаешь городить из примитивов kotlin runtime, оказывается, что нужно либо создавать лишние pair, либо искать что-то лишний раз, что можно было бы и не искать, ну и так далее. Зато стандартный runtime все более менее знают и есть мануалы. В общем, всякой задаче свои инструменты
источник
2020 April 14

RI

Ruslan Ibragimov in Kotlin Moscow
data class ClassA(val fieldId: String)
data class ClassB(val fieldId: String)

fun merge(typeA: Collection<ClassA>, typeB: Collection<ClassB>): Map<ClassA, ClassB> {
   // Assume that typeB big en ought, so constant lookup is more important
   val lookupB = typeB.associateBy { it.fieldId }
   return typeA.fold(mutableMapOf()) { acc, classA ->
       lookupB[classA.fieldId]?.let {
           acc.put(classA, it)
       }
       acc
   }
}


ну вот решение задачи на stdlib, где тут проблемы с "kotlin runtime"?
источник

MZ

Maxim Zinchenko in Kotlin Moscow
по сути вы не используете kotlin runtime и это совсем не переиспользуемый код, так что это скорее мой пример. так можно доказать, что и JDK неплох, если работать на чистых array и никаких объектов не создавать.
источник

MZ

Maxim Zinchenko in Kotlin Moscow
вы написали офигенно заточенное под конкретную задачу низкоуровневое решение. собственно это я и предлагал рассмотреть человеку, так что мне спорить тут не о чем
источник

RI

Ruslan Ibragimov in Kotlin Moscow
Эм, а вы ожидаете что для любой задачи в стандартной библиотеке должен быть готовый оператор?
источник

MZ

Maxim Zinchenko in Kotlin Moscow
нет. потому как задачи у всех больно разные. про то и речь - хочешь что-то хорошее сделай это сам, а не городи сложный огород из готовых конструкций. ну либо найди готовую либу, но ради такой ерундовой задачи вряд ли стоит её нести.
источник

RI

Ruslan Ibragimov in Kotlin Moscow
Ну я вот взял associateBy и fold, а не делал два форича, чтобы из списков мапы делать. Это огород из готовых конструкций, или нет?
источник

MZ

Maxim Zinchenko in Kotlin Moscow
нет, я так не думаю. всё-таки это довольно низкоуровневый код. причём даже если избавится здесь от мутабельной мапы, понятнее код не станет. так что основная претензия к рантайму наверное в том, что просто так взять и начать писать функциональный код не получится. не факт что такие операции как join так уж необходимы большинству, но когда тебе что-то такое нужно, каждый раз приходится со вздохом дописывать что-то ещё
источник

RI

Ruslan Ibragimov in Kotlin Moscow
Замена на немутабельную мапу тут не спасет ситуацию, ну будем каждый раз новую создавать. Но оверхед. И даже persistent map не спасет тут, учитывая характер операций.
источник

AN

Alexander Nozik in Kotlin Moscow
Maxim Zinchenko
нет, я так не думаю. всё-таки это довольно низкоуровневый код. причём даже если избавится здесь от мутабельной мапы, понятнее код не станет. так что основная претензия к рантайму наверное в том, что просто так взять и начать писать функциональный код не получится. не факт что такие операции как join так уж необходимы большинству, но когда тебе что-то такое нужно, каждый раз приходится со вздохом дописывать что-то ещё
Что вы все время либу рантаймом обзываете. Большая ее часть вообще инлайнится.
источник

VS

Vladimir Sitnikov in Kotlin Moscow
Maxim Zinchenko
нет, я так не думаю. всё-таки это довольно низкоуровневый код. причём даже если избавится здесь от мутабельной мапы, понятнее код не станет. так что основная претензия к рантайму наверное в том, что просто так взять и начать писать функциональный код не получится. не факт что такие операции как join так уж необходимы большинству, но когда тебе что-то такое нужно, каждый раз приходится со вздохом дописывать что-то ещё
Можно mutableMap и спрятять. «низкоуровневый» код вообще пропал.

fun merge(typeA: Collection<ClassA>, typeB: Collection<ClassB>): Map<ClassA, ClassB> {
   // Assume that typeB big en ought, so constant lookup is more important
   val lookupB = typeB.associateBy { it.fieldId }
   return typeA.asSequence()
       .filter { it.fieldId in lookupB }
       .associateWith { lookupB[it.fieldId]!! }
}
источник

VS

Vladimir Sitnikov in Kotlin Moscow
Ruslan Ibragimov
Замена на немутабельную мапу тут не спасет ситуацию, ну будем каждый раз новую создавать. Но оверхед. И даже persistent map не спасет тут, учитывая характер операций.
Я так понимаю, претензия была не к persistent map, а к ручному созданию mutableMap() и get/put.
источник

MZ

Maxim Zinchenko in Kotlin Moscow
Alexander Nozik
Что вы все время либу рантаймом обзываете. Большая ее часть вообще инлайнится.
Предложите свой вариант. На самом деле инлайнится не всё, всё-таки 4Мб+ class файлов остаётся и в рантайм тащится. Но это конечно не сравнимо с JRE или каким-нибудь spring.
источник

AN

Alexander Nozik in Kotlin Moscow
Maxim Zinchenko
Предложите свой вариант. На самом деле инлайнится не всё, всё-таки 4Мб+ class файлов остаётся и в рантайм тащится. Но это конечно не сравнимо с JRE или каким-нибудь spring.
Это где вы 4 мб взяли? И как вы определяете что "тащится в рантайм", а что просто лежит и не загружается?
источник

AN

Alexander Nozik in Kotlin Moscow
Вы вообще что рантаймом-то называете?
источник

MZ

Maxim Zinchenko in Kotlin Moscow
Alexander Nozik
Это где вы 4 мб взяли? И как вы определяете что "тащится в рантайм", а что просто лежит и не загружается?
kotlin-reflect, kotlin-stdlib, kotlin-stdlib-common, ... остальное совсем копьё.
учитывая, какие там классы лежат, думаю грузится 90%, но не проверял
источник

MZ

Maxim Zinchenko in Kotlin Moscow
classpath в рантайме
источник

AN

Alexander Nozik in Kotlin Moscow
стдлиба с рефлектом вместе в районе 3 мб - и это всего. Сколько из этого подкгружается зависит от вашей программы. Вы можете большую часть выпилить при помощи какого-нибудь r8 или как его.
источник

И

Илья in Kotlin Moscow
А можно не уместный вопрос
источник

И

Илья in Kotlin Moscow
А почему самому не написать реализацию, не ужели так сложно это сделать или совсем писать код лень?
источник