2011-01-21 3 views
14

У меня есть интересный архитектурный вопрос относительно приложения, которое я разрабатываю с использованием как Clojure, так и Java. Приложение включает в себя множество интенсивных параллельных задач обработки данных, которые необходимо организовать.Где провести линию между Clojure и Java?

Вот логическое обоснование для смешивания как Clojure и Java:

  • Java необходим для некоторых довольно CPU-интенсивного числового кода, где мне нужно оптимизировать алгоритмы для работы как можно быстрее на JVM , Clojure пока не может этого достичь, и такой код не будет очень идиоматичным в Clojure, потому что алгоритмы требуют много изменчивых данных по соображениям производительности.
  • Clojure is (IMHO) намного лучше для , управляя полным потоком приложения, с его превосходной поддержкой функционального программирования, интерактивной динамической разработки в функции REPL и параллелизма.

Учитывая, что я использую оба языка - какую логику или принципы следует применять для определения разделительной линии между ними? В частности, меня интересует, как разработать API/интерфейс, который будет на правильном уровне, чтобы использовать преимущества сильных сторон обоих языков.

+0

Я немного удивлен вашим первым утверждением: по моему опыту цифровой код отлично подходит для Clojure, но не очень хорошо подходит для подхода OO. Что касается производительности: действительно ли вы измерили разницу? Тип намека на Clojure приблизит вас к производительности Java. Я также не понимаю потребности в изменяемых данных по причинам производительности. Может быть, вы можете привести здесь пример? –

+0

@ Мауриц - да, я измерил разницу! тип подсказки не достал меня достаточно близко (бокс примитивов - большой убийца, но были и некоторые другие накладные расходы, которые я не мог понять - может быть, я перейду в Clojure 1.4 :-)). Мне нужна изменчивость, потому что мне приходится манипулировать множеством временных рабочих данных. a [i] = a [j] + x очень быстро работает в Java, конечно, по крайней мере на порядок быстрее, чем обновление любой неизменяемой структуры данных (что подразумевает распределение объектов и gc-служебные данные). – mikera

+0

Это действительно не ответит на ваш вопрос, но вы также можете подумать о том, чтобы делать большую часть числовой стороны в C++/C и JNI от Clojure – justinhj

ответ

10

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

Классы, ответственные за числовой код и вычисление, должны быть написаны на Java и все остальное в Clojure. Я бы даже взял более агрессивный подход и просто разработал классы, чтобы они отличались, так что они могли писать на Java, но на самом деле писать их в Clojure и переписывать их на Java, если производительность оказывается проблемой.

+0

спасибо Yishai - хорошие идеи! наряду с некоторыми другими экспериментами, я сходился на этом как лучшее решение – mikera

2

Clojure отлично помогает разработчикам получить большую часть своей части в простом функциональном стиле и изолировать мутационную работу в ограниченных областях.

Я бы применил те же самые рекомендации здесь: изолируйте код Java как можно больше, так как вы будете делать столько же своего кода clojure в «чистом функциональном стиле». Таким образом, остров java будет как можно меньше, учитывая ваши ограничения, и доступ к острову java будет проходить через небольшой набор функций clojure.

Не уверен, что это очень помогает, но в любом случае!

Смежные вопросы