I have written a primitive function for exponentiation with integers as 
power using the multiply-and-square algorithm.
For performance reasons I used primitive type hints for the arguments and 
the return value.
Profiling the whole application I noticed that there are a lot of 
java.lang.Double/valueOf calls.
Looking at the bytecode I see that in Clojure 1.3 as well as in Clojure 1.4 
the result value gets boxed and unboxed like 
Double.valueOf(result).doubleValue().

Am I doing something wrong? Is there a serious bug related to the support 
of primitive functions?

The source code:

(defn first-bit?
  {:inline (fn [n] `(== 1 (clojure.lang.Numbers/and ~n, 1)) )}
  [^long n]
  (== 1 (clojure.lang.Numbers/and n, 1)))

(defn exp-int
  ^double [^double x, ^long c]
  (loop [result 1.0, factor x, c c]
    (if (> c 0)
        (recur 
         (if (first-bit? c)
           (* result factor)
           result),
         (* factor factor),
         (bit-shift-right c 1))
      result)))

Last lines of the Java bytecode of `exp-int`:
59 dload 5;               /* result */
61 invokestatic 40;       /* java.lang.Double 
java.lang.Double.valueOf(double c) */
64 checkcast 85;          /* java.lang.Number */
67 invokevirtual 89;      /* double doubleValue() */
70 dreturn;

-- 
You received this message because you are subscribed to the Google
Groups "Clojure" group.
To post to this group, send email to clojure@googlegroups.com
Note that posts from new members are moderated - please be patient with your 
first post.
To unsubscribe from this group, send email to
clojure+unsubscr...@googlegroups.com
For more options, visit this group at
http://groups.google.com/group/clojure?hl=en

Reply via email to