С высоты-2

Jul 08, 2019 17:25


В предыдущем посте я разочаровывался в Clojure, а точнее в тех задачах, которые хочу на ней решать. С языком-то все нормально, он ровно то, за что себя выдает. Просто до какого-то момента и для каких-то задач на это удобно закрывать глаза, ну а мне уже не удобно.

Ну и что я сделал. Я пошел учить Rust. Не, ну интересно же, как компьютеры сегодня ( Read more... )

Leave a comment

ext_1315491 July 9 2019, 05:39:35 UTC
Никита, ну у тебя же весь кложуровский проект в “Boxed math warning”, как же так?
И “Reflection warning” тоже имеются.

Также непонятно, с какими параметрами java это всё запускалось, и, кажется, всё запускалось через lein без aot, что тоже может иметь отношение к производительности.

И если уж выделять именно overhead, то надо было брать JVM язык для сравнения, тем более что ты уже пишешь на котлине.

Reply

tonsky July 9 2019, 08:20:08 UTC
> Никита, ну у тебя же весь кложуровский проект в “Boxed math warning”, как же так?

Ну это же Clojure, пойди ее убеди примитивы между функциями передать. На Java можно было бы, на Clojure почти невозможно в любой не-игрушечной программе

> И “Reflection warning” тоже имеются.

Хде?

> через lein без aot, что тоже может иметь отношение к производительности

ну-ка, просвяти меня, какое отношение aot имеет к производительности?

> И если уж выделять именно overhead, то надо было брать JVM язык для сравнения, тем более что ты уже пишешь на котлине.

Ты наверное неправильно понял. Мы взяли что взяли и сравнили что было. Было бы круто сравнить все возможные языки между собой? Конечно. Но у нас есть то что есть. Хочешь чего-то другого - пожалуйста, код открыт

Reply

tonsky July 9 2019, 13:37:02 UTC
> И “Reflection warning” тоже имеются.

блин, опять меня подвел repl. (set! *warn-on-reflection* true) не работает, надо через lein ставить. Имеются, в общем. Но не принципиальные - время не уменьшается

Reply

ext_1315491 July 9 2019, 17:48:51 UTC
в файлах с `(set! *warn-on-reflection* true)` как раз всё нормально
но оно не во всех файлах включено

Reply

tonsky July 9 2019, 18:48:18 UTC
я если честно до сих пор не понимаю как оно per-file работает. Это ж глобальная переменная

Reply

ext_1315491 July 9 2019, 17:59:01 UTC
> ну-ка, просвяти меня, какое отношение aot имеет к производительности?

ну сказал глупость по незнанию, с кем не бывает.

> Ну это же Clojure, пойди ее убеди примитивы между функциями передать.

вроде как в основном расстановка тайпхинтов, как на Java :-)

> Ты наверное неправильно понял.

Да, цели описанного исследования не очень понятны, поэтому вот так.
Если показать что кложа даёт оверхед к яве - это одно.
Если показать, что ява медленнее раста - другое.
Или забить на boxed math - и разбирайтесь сами, какой вклад тут на производительность.

Ни цели, ни методология не ясны, зато драматизм в полный рост :-)

Reply

tonsky July 9 2019, 18:47:21 UTC
> вроде как в основном расстановка тайпхинтов, как на Java :-)

Нет. Есть два типа тайп хинтов. Одни убирают рефлекшн. Это просто компилятор не знает какой из N перегруженных методов позвать. Но в коде написанном на Clojure рефлекшна как правило нет или почти нет. Зато такие хинты всегда просто расставить.

Другие тайп хинты - примитивные типы. Они нормально работают внутри функций, но между функциями почти что не работают. То есть в цикле ты еще можешь long-ом оперировать, но хочешь передать его наружу или наоборот вызвать какую-то функцию внутри - не получится.

> Если показать что кложа даёт оверхед к яве - это одно.
> Если показать, что ява медленнее раста - другое.

Показать что Кложа медленнее раста

Reply

ext_1315491 July 10 2019, 12:39:54 UTC
> Другие тайп хинты - примитивные типы

Пример c long вроде как неудачен,
https://clojure.org/reference/java_interop#optimization,
> All arguments are passed to Clojure fns as objects, so there’s no point to putting arbitrary primitive type hints on fn args (excepting primitive array type hints, and long and double as noted)

("int" - "нельзя", "long" - типа "можно", функция с такими хинтами создаётся и вызывается)
(до сегодняшнего дня думал, что можно передавать только объекты)

Reply

tonsky July 10 2019, 14:33:00 UTC
Только функции до четырех аргументов, только long, double и Object в разных комбинациях. В компиляторе по такому случаю проковыряна специальная дырочка https://github.com/clojure/clojure/blob/653b8465845a78ef7543e0a250078eea2d56b659/src/jvm/clojure/lang/IFn.java#L97-L454

Reply


Leave a comment

Up