
Igor
26.08.2018
20:09:09
Таки есть пpикольный хак, чтобы pаботало. Вот так вот выглядит:
https://programmingideaswithjake.wordpress.com/2016/08/27/improved-pattern-matching-in-kotlin/
В итоге на пpактике (пpишлось что-то поменять, но в целом почти так осталось, как в сэмпле выше):
when (item.let(PlatformPlanEntity.isNext::get zip PlatformPlanEntity.status::get)
.let(Tuple2P.Companion.iso<Boolean, TaskStatus>()::reverseGet)) {
Pattern(Tuple2P<Boolean, TaskStatus>::a) -> {
}
Pattern(Tuple2P<Boolean, TaskStatus>::b andThen TaskStatus.None::equals) -> {
}
Pattern(Tuple2P<Boolean, TaskStatus>::b andThen TaskStatus.Failure::equals) -> {
}
Pattern(Tuple2P<Boolean, TaskStatus>::b andThen TaskStatus.Success::equals) -> {
}
}
Tuple2P соответственно тот же tuple2, только поддеpживающий матчинг.
Не то, чтобы сильно удобно, но в целом выглядит пpикольно.

Alexey
26.08.2018
20:19:56

Google

lenar
26.08.2018
20:49:41

Artem
26.08.2018
21:14:02

Иван
26.08.2018
21:59:08
А что есть перфоманс из http клиентов? Пробовал ktor-http-client поверх Apache клиента (HttpClient(Apache)). Есть что-то ещё? CIO клиент что-то не завёлся из-за какого-то header в response незнакомого ему o_O
Хочется минимум зависимостей и как минимум 1000 rps. В целях провести нагрузочное тестирование с одной тачки без всяких гатлингов, танков и прочего.
Может есть готовые фреймворки для такого?

Sergey
27.08.2018
05:13:50
эх пропустил весь срач про корутины

Mi
27.08.2018
05:19:15

Sergey
27.08.2018
05:19:37

OlegKrikun
27.08.2018
06:44:10
https://plus.google.com/111471886409455069782/posts/4AxzbjnuRs5
Внезапно

Victor
27.08.2018
06:45:22

Sergey
27.08.2018
06:46:04

Victor
27.08.2018
06:48:13

Mi
27.08.2018
06:49:12

Igor
27.08.2018
06:49:16

Google

Mi
27.08.2018
06:49:24
Просто они более узкоспециализированные

OlegKrikun
27.08.2018
07:02:13
Как-то это не явно, странно что в доках это не описанно большими красными буквами

Костя
27.08.2018
07:11:16

OlegKrikun
27.08.2018
07:15:39
Ага

Vladimir
27.08.2018
07:16:58

Quantum Harmonizer
27.08.2018
07:38:18

OlegKrikun
27.08.2018
08:07:00

Nail
27.08.2018
08:14:38

OlegKrikun
27.08.2018
08:15:09
По использованию?

Nail
27.08.2018
08:16:36
Мы же объёвляем переменную зараннее. Если бы мы её сразу положили куда нужно, то тогда бы он определил

Quantum Harmonizer
27.08.2018
08:25:24

Roman
27.08.2018
08:37:31
а return@label чем не goto?
Ну как бы это сказать... Всем. В первую очередь тем, что return/break/continue это _структурные_ конструкции. В отличие от goto они не позволяют сломать вложенность блоков кода (инкапсуляцию куска логики в блок кода), что существенно упрощает анализ логики программы для человека.

Alexey
27.08.2018
08:38:30

Денис
27.08.2018
09:45:47
Соответственно классический goto просто за счёт ~безграничной ширины возможностей позволяет сломать куда больше по определению.

Alexey
27.08.2018
09:47:13
Ну энивей, ты не можешь просто читать код сверху вниз

Денис
27.08.2018
09:52:57
Ну энивей, ты не можешь просто читать код сверху вниз
Ну...
Return@label практически гарантирует, что ты увидел лейбл (и если ими не злоупотреблять, то это будет примечательно, и запомнится), к которому будет возврат, т.е. шансы запомнить скоуп/контекст такого return, кажется, относительно высокие.
А вообще - well, shit, если уж на то пошло, любой сложный код читается не совсем линейно как минимум потому, что где-то могут вызываться другие методы/функции, и если тебе критично важно понимать, что в них произошло, то ты, наверное, будешь прыгать между этими самыми объектами/методами/функциями.


Victor
27.08.2018
12:24:50
Ну...
Return@label практически гарантирует, что ты увидел лейбл (и если ими не злоупотреблять, то это будет примечательно, и запомнится), к которому будет возврат, т.е. шансы запомнить скоуп/контекст такого return, кажется, относительно высокие.
А вообще - well, shit, если уж на то пошло, любой сложный код читается не совсем линейно как минимум потому, что где-то могут вызываться другие методы/функции, и если тебе критично важно понимать, что в них произошло, то ты, наверное, будешь прыгать между этими самыми объектами/методами/функциями.
Про ""... практически гарантирует, что ты увидел лейбл..." вспоминается "А гренка в нашем ресторане называется крутон. Это точно такой же поджаренный кусочек хлеба, только гренка не может стоить 8 долларов, а крутон — может"

Денис
27.08.2018
12:25:48

Google

Andrey
27.08.2018
12:26:55

Денис
27.08.2018
12:27:28

Alexander
27.08.2018
15:21:15
Как на котлине правильно JMH запустить с состоянием?
Все попытки содрать чужие примеры кончаются Field "array" is declared within the class not having @State annotation. This can result in unspecified behavior, and prohibited.

Quantum Harmonizer
27.08.2018
15:29:13

Alexander
27.08.2018
15:29:42
Да у меня все работало в другом проекте без состояния
Здесь рушится на этапе генерации байткода
Хочу проверить скорость чтения/записи из Array<Int> и IntBuffer
О, откадил jmh до 0.4.5, все заработало
Видать что-то испортили

Boris
27.08.2018
15:34:29

Alexander
27.08.2018
15:35:18
Не должно быть там боксинга.

Quantum Harmonizer
27.08.2018
15:36:01
в Array<Int> же будет

Larymar
27.08.2018
15:36:23
Подскажите что за типы с восклицательным знаком даже не знаю как это погуглить
String!

Boris
27.08.2018
15:36:40
Мм, рассчитываешь, что компилятор оптимизирует и сделает из него IntArray?

Bogdan
27.08.2018
15:36:58

Boris
27.08.2018
15:37:16

Roman
27.08.2018
15:37:18

Alexander
27.08.2018
15:37:40
Котлин должен боксинг съесть вроде как.

Roman
27.08.2018
15:37:44
https://kotlinlang.org/docs/reference/java-interop.html#null-safety-and-platform-types

Google

Alexander
27.08.2018
15:37:45
Разница 15 %

Quantum Harmonizer
27.08.2018
15:37:54

Boris
27.08.2018
15:38:06

Admin
ERROR: S client not available

Quantum Harmonizer
27.08.2018
15:38:26
как и в Java, примитивы (раз)боксятся автоматом, массивы — нет

Alexander
27.08.2018
15:38:26
Почему, я же IntArray оборачиваю, он внутре array примитивов

Quantum Harmonizer
27.08.2018
15:38:56
Array<*> — это всегда массив объектов, а *Array — примитивов

Boris
27.08.2018
15:39:20

Alexander
27.08.2018
15:39:41
array = IntArray(10000) { it }
arrayBuffer = IntBuffer.wrap(array)
а, сорри, неправильно написал исходно

Boris
27.08.2018
15:40:42
Мы говорим о том, что Array<> всегда будет ссылки держать внутри

Alexander
27.08.2018
15:40:49
это да

Quantum Harmonizer
27.08.2018
15:40:54
то есть между int[] и IntBuffer такая разница?

Alexander
27.08.2018
15:42:05
да

Boris
27.08.2018
15:42:16
У интбуфера есть очевидные накладные расходы

Alexander
27.08.2018
15:42:46
Сейчас еще проверю для нативного буфера
о
Вот этого я не ожидал совершенно
Benchmark Mode Cnt Score Error Units
ArrayBenchmark.benchmarkArrayRead thrpt 10 26864.946 ± 1655.356 ops/s
ArrayBenchmark.benchmarkBufferRead thrpt 10 30442.452 ± 3699.404 ops/s
ArrayBenchmark.nativeBufferRead thrpt 10 29841.918 ± 2674.617 ops/s
Нативный -это просто аллоцированный и заполненный руками

Google

Alexander
27.08.2018
15:43:38
Я ожидал, что он медленнее будет.
Вопрос возник для реализации многомерных массивов. Насколько вреднео использовать для этого буфферы

Boris
27.08.2018
15:45:31
Инлайн класс матрица ?

Alexander
27.08.2018
15:46:33
Буфер решает много проблем с сериализацией, решейпингом и единым кодом для произвольных форматов
Для матрицы все сделано на масивах, речь об аналоге ndarray

Quantum Harmonizer
27.08.2018
15:47:16
NDArray ?

Alexander
27.08.2018
15:47:32
ага
https://github.com/altavir/kmath/blob/dev/kmath-common/src/main/kotlin/scientifik/kmath/structures/NDArray.kt
В данном случае интерфейсы абстрактные, можно хоть две реализации сделать. Вопрос, сколько теряется на буфферах.
В общем, чувствуется, что для примитивов массивы все-таки быстрее будут. Видимо надо будет делать нескоько реализаций. Много геморроя.

Boris
27.08.2018
15:51:36

Alexander
27.08.2018
15:52:15
Каким образом?