Оптимизация взаимодействия Java с помощью Clojure

StackOverflow https://stackoverflow.com//questions/22077496

  •  23-12-2019
  •  | 
  •  

Вопрос

При работе с существующими классами Java я часто получаю предупреждения, если я сделал что-то неправильно, например.

IllegalArgumentException Соответствующее поле не найдено:Получен для класса java.lang.string clojure.lang.reflector.getinstancefield (Reflector.java:271)

Выполняет ли Clojure отражение во время выполнения для каждого вызова данных методов?или это каким-то образом кэшируется?Будет ли преимущество в скорости при перемещении любого задействованного Java-взаимодействия в связанный Java-класс?

Это было полезно?

Решение

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

user=> (set! *warn-on-reflection* true)

user=> (defn str-len [x] (.length x))
Reflection warning, NO_SOURCE_PATH:1:19 - reference to field length can't be resolved.

user=> (defn str-len-2 [^String x] (.length x))

user=> (str-len "abc") ; -> 3
user=> (str-len-2 "abc") ; -> 3

user=> (time (dotimes [_ 100000] (str-len "abc")))
"Elapsed time: 1581.163611 msecs"
user=> (time (dotimes [_ 100000] (str-len-2 "abc")))
"Elapsed time: 36.838201 msecs"
.

Первая функция будет использовать отражение каждый раз, когда он вызывается;Второй имеет аналогичную производительность на родной код Java.

Другие советы

Это не предупреждение об отражении, это просто указание на то, что оно использовало отражение.

Вы можете использовать введите подсказки для устранения отражения.А *warn-on-reflection* флаг, как описано в приведенной выше ссылке (по умолчанию false), при необходимости включает предупреждения отражения.

Я считаю удобным использовать Лейнинген lein check утилита, которая пытается скомпилировать каждый файл Clojure в вашем проекте с включенными предупреждениями об отражениях.Это сообщит о проблемах отражения в вашем коде или в любом коде, загруженном из библиотек.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top