У меня есть интересный архитектурный вопрос относительно приложения, которое я разрабатываю с использованием как Clojure, так и Java. Приложение включает в себя множество интенсивных параллельных задач обработки данных, которые необходимо организовать.Где провести линию между Clojure и Java?
Вот логическое обоснование для смешивания как Clojure и Java:
- Java необходим для некоторых довольно CPU-интенсивного числового кода, где мне нужно оптимизировать алгоритмы для работы как можно быстрее на JVM , Clojure пока не может этого достичь, и такой код не будет очень идиоматичным в Clojure, потому что алгоритмы требуют много изменчивых данных по соображениям производительности.
- Clojure is (IMHO) намного лучше для , управляя полным потоком приложения, с его превосходной поддержкой функционального программирования, интерактивной динамической разработки в функции REPL и параллелизма.
Учитывая, что я использую оба языка - какую логику или принципы следует применять для определения разделительной линии между ними? В частности, меня интересует, как разработать API/интерфейс, который будет на правильном уровне, чтобы использовать преимущества сильных сторон обоих языков.
Я немного удивлен вашим первым утверждением: по моему опыту цифровой код отлично подходит для Clojure, но не очень хорошо подходит для подхода OO. Что касается производительности: действительно ли вы измерили разницу? Тип намека на Clojure приблизит вас к производительности Java. Я также не понимаю потребности в изменяемых данных по причинам производительности. Может быть, вы можете привести здесь пример? –
@ Мауриц - да, я измерил разницу! тип подсказки не достал меня достаточно близко (бокс примитивов - большой убийца, но были и некоторые другие накладные расходы, которые я не мог понять - может быть, я перейду в Clojure 1.4 :-)). Мне нужна изменчивость, потому что мне приходится манипулировать множеством временных рабочих данных. a [i] = a [j] + x очень быстро работает в Java, конечно, по крайней мере на порядок быстрее, чем обновление любой неизменяемой структуры данных (что подразумевает распределение объектов и gc-служебные данные). – mikera
Это действительно не ответит на ваш вопрос, но вы также можете подумать о том, чтобы делать большую часть числовой стороны в C++/C и JNI от Clojure – justinhj