Sometimes, as Clojure is dynamically typed, the Clojure compiler is unable to figure out the type of object to invoke a certain method. In such cases, Clojure uses reflection, which is considerably slower than the direct method dispatch. Clojure's solution to this is something called type hints. Type hints are a way to annotate arguments and objects with static types, so that the Clojure compiler can emit bytecodes for efficient dispatch.
The easiest way to know where to put type hints is to turn on reflection warning in the code. Consider this code that determines the length of a string:
user=> (set! *warn-on-reflection* true) true user=> (def s "Hello, there") #'user/s user=> (.length s) Reflection warning, NO_SOURCE_PATH:1 - reference to field length can't be resolved. 12 user=> (defn str-len [^String s] (.length s)) #'user/str-len user=> (str-len s) 12 user=> (.length ^String s) ; type hint when passing argument 12 user=> (def ^String t...