Запуск Java-кода в Clojure с той же скоростью, что и Java из Java - PullRequest
0 голосов
/ 31 марта 2012

У меня есть следующий код:

(let [obs ^java.util.Observer (proxy [java.util.Observer] []
              (update [^Object o ^String arg]
                (println arg)))
        network ^StockPriceNeuralNetwork (NeuralNetworkFactory/createStockMarketNeuralNetwork ^java.util.List [^java.util.Observer obs])]
    (.trainForTime ^StockPriceNeuralNetwork network))

Проблема в Java, этот код работает примерно в 100 раз быстрее, чем при вызове из Clojure после компиляции кода.Есть ли способ получить ту же производительность Java, вызывая ее из Clojure, или она всегда будет медленнее?

1 Ответ

8 голосов
/ 01 апреля 2012

Здесь гораздо больше шрифтов, чем необходимо, и те, которые у вас есть, размещены так, что я не совсем уверен, что они приносят какую-то пользу - вы действительно должны указывать имя в let, а не взначение.То есть (let [^Observer obs (...)] ...), а не (let [obs ^Observer (...)] ...).Во многих случаях оба из них будут работать, но первый гораздо «безопаснее».Также верно, что вам следует строго отдавать предпочтение reify, а не proxy здесь, как для производительности, так и потому, что proxy не рекомендуется, когда вы можете этого избежать.

Я не знаю, какую библиотеку нейронных сетей вывы используете, так что вам может понадобится единственная подсказка типа для аргумента createStockMarketNeuralNetwork, но остальные не служат никакой цели, кроме как вводить в заблуждение любого, кто читает ваш код - даже возможно, что чрезмерные шрифты введут в заблуждениекомпилятор для написания более медленного кода, если вы выбираете не точные подсказки.Таким образом, вместо того, чтобы размещать их произвольно по всему коду, переключитесь на подход reify, предложенный sw1nn, а затем установите *warn-on-reflection* в значение true и посмотрите, что, если таковое имеется, отражение является проблемой.Ниже приведена версия этого кода с reify, и после удаления всех шрифтов, которые я знаю , ничего не изменилось:

(let [obs (reify java.util.Observer
            (update [this o arg]
              (println arg)))
      ^StockPriceNeuralNetwork network (NeuralNetworkFactory/createStockMarketNeuralNetwork ^java.util.List [obs])]
  (.trainForTime network))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...