А с производительностью кода всё так же плохо? Взя...
# russian
a
А с производительностью кода всё так же плохо? Взял ради забавы математический тестик - https://github.com/Mark-Kovalyov/CardRaytracerBenchmark/blob/master/java/CardRaytracer.java Удалил оттуда всё IO, конвертировал в kotlin и получил (макбук-про 15го года) 5m52.234s вместо 0m22.359s для java/JDK14 В 16 раз дольше это перебор, на мой взгляд. Или код плохой? https://github.com/alekseytomin/CardRaytracerBenchmark/blob/kotlin-native/kotlin-native/src/nativeMain/kotlin/app.kt
g
на какой платформе?
ааа вижу, это kotlin/native, ну так то ожидаемо конечяно, но да, 16 раз выглядит не очень, надо видимо мерить подробней
a
На нативе своя специфика и код из JVM нельзя туда напряму транслировать и ожидать той же производительности.
Посмотрите в первую очередь боксинг и те места, где эскейп-анализ нужен
a
Ну там чистая математика...
a
Плюс на JDK14 работает авто-векторизация. Попробуйте на старых JDK
a
Да там и на java-то написано так себе- без прогрева 🙂 На 8ке 24с работает
a
ну то есть оно и не векторизуется.
Ну вот такие вещи вообще нельзя делать в нативе: https://github.com/Mark-Kovalyov/CardRaytracerBenchmark/blob/e951e091b2ec87f7621a08eae7d6defdf63accb0/java/CardRaytracer.java#L142
Там лишняя аллокация вообще низачем. В JVM оно скаляризуется, а вот в нейтиве вряд ли
a
Да, одно это сильно улучшило ситуацию: 3m45.265s
a
Ну это то, что мне в глаза сразу бросилось при беглом просмотре, я уверен, что там еще куча мест.
a
Возможно. Кстати, что-то вроде в 1.4 с памятью поправили -типа по-другому можно выделять. Надо будет найти...
a
Это не спасет. Тут просто лишняя аллокация. Как не выделяй. Такие вещи убираются только при помощи продвинутого escape analysis. Его просто нет в нативных компиляторах.
a
Я убрал. Есть
-Xallocator=mimalloc
но непонятно, куда это писать
О, теперь 1m26s - уже в 3 раза разница 🙂 Притом, что скорость никто не обещал - результат нормальный
a
Ну там надо ручками код посмотреть и клонировать скорее не джавовую реализацию, а сишную. Тогда производительность будет какая надо
Мы просто все очень ленивые после JVM
t
@altavir как будто это^ что-то плохое)
a
Мы просто все очень ленивые после JVM
Это не лень. Это просто уверенность в инструменте. Когда имеешь дело с С - постоянно как по минному полю идёшь. Один неверный шаг- и сообщение об ошибке разбудит ктулху 👹
a
Ну вот в K-N такого не будет, но по перформансу легко провалиться
t
В kn не только это, но ещё и модель памяти стреляет на каждом шагу
a
Пример в студию пожалуйста. В кого она стреляет и что это за шаги. Насколько я знаю, там только одно такое место
t
MutabilityException и фризинг же
Понятно что это не для математики, а для приложений, но проще не становится
@altavir да где угодно можно поймать, собственно обещали уже сделать LAX-модель, чтобы можно было нормально код писать сразу и под native
a
@thevery MutabilityException это как? Но вообще текущая модель памяти в native заточена под immutable. Реализация многопоточной очереди доставила мне немало весёлых минут, и то- сделал я весьма неоптимально 🙂
a
Многопоточная очередь реализуется каналом и не надо там городить что-то свое. А ошибка возникает в основном когда используется глобальный стейт или сингетон со стейтом
Собтсвенно конкуррентой модификации объектов не должно быть и в JVM, но там есть шанс, что вас виртуальная машина спасет.
t
Каналы не решают проблему фризов
a
Многопоточная очередь реализуется каналом
https://kotlinlang.org/docs/reference/coroutines/channels.html - это?
a
да
👍 1
t
Собственно даже в корутинах есть проблемы из-за memory model
a
Есть и поэтому там добавляют релакс-модель. Но в целом та модель, что есть - хороша.
Собственно вариант, когда релакс модель только внутри корутин я считаю идеальным.
t
Immutable - это хорошо, а вот freeze - это плохо
a
А как одно без другого существовать должно?
t
Уточню - проблема freeze в заморозке всего окружения, вместо одного объекта.
a
ну придумайте как сделать лучше.
t
Ну есть detach или как там его, только это дико неудобно
И я жду lax всё же
a
От сюда мораль, не должно быть изменяемых состояний в многопоточности вообще. Все операции через корутины. Многопоточность - это сложно.
t
Корутины - это отдельная боль. А если двигаться к "как правильно" вместо "как удобно", можно и до скалы докатиться
1
Опять же типичный kmm вообще плохо заточен под отсутствие многопоточности (при этом у него нет проблемы с полезной немутабельностью в целом, проблема только во фризах)
1