On Wed, Dec 22, 2010 at 1:19 PM, Rayne <disciplera...@gmail.com> wrote:
> chouser wrote a solution earlier. I and a buddy modified it (a very
> little) bit and managed to get it pretty blazing:
>
> ra...@ubuntu:~$ cake run ~/challenge.clj
> Chars outputted: 460
> Time (in nanoseconds): 5768.677
>
> Here is the function:
>
> (defn count-num-chars [^String s]
>  (let [len (.length s)
>        space (int 32)]
>    (loop [i (int 0), c (int 0)]
>      (if (< i len)
>        (recur
>         (inc i)
>         (if (== (.codePointAt s i) space)
>           c
>           (unchecked-inc c)))
>        c))))

I get about 6000ns with this also. It looks like one bit of Clojure in
need of improvement is the handling of the = operator: if at compile
time it's known that either side is a primitive or a character
constant, it really ought to boil down to a Java == operator, but
apparently it doesn't, and JIT and branch prediction don't suffice to
render the difference moot.

Also, == doesn't seem to work with characters -- ClassCastException
java.lang.Character can't be cast to java.lang.Number. This with
\space or (char \space) on the right hand side and (.charAt s i) on
the left. The odd thing is this suggests == isn't a raw Java ==
operator call but rather a method call of Number, likely .equals.
Which shouldn't be particularly fast.

Now, identical? IS supposed to be Java's == operator but for

(defn count-num-chars [^String s]
 (let [l (int (.length s)) c (char \space)]
   (loop [i (int 0) acc (int 0)]
     (if (< i l)
       (recur (unchecked-inc i) (if (identical? (.charAt s i) c) acc
(unchecked-inc acc)))
       acc))))

I get 9000ns, about two-thirds the speed I get using == and .codePointAt.

Something interesting is going on among =, ==, and identical? here,
but I'm not 100% sure what. Perhaps identical? is not managing to have
its function call overhead JITted away, while the Clojure compiler
treats the operators specially; in theory it *should* be fastest.

-- 
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