On Tue, May 3, 2011 at 8:03 AM, David Nolen <dnolen.li...@gmail.com> wrote:
> Why not?
> user> (time (dotimes [_ 1000000000] (Math/ceil 0.1)))
> "Elapsed time: 626.867 msecs"
> David

It's optimizing your loop away, or else you're using ridiculously
powerful hardware.

user=> (time (dotimes [_ 1000000] (Math/ceil (rand))))
"Elapsed time: 142.86748 msecs"
nil

Making it a local of type "double" seems slightly faster:

user=> (time (dotimes [_ 1000000] (let [x (double (rand))] (Math/ceil x))))
"Elapsed time: 136.96752 msecs"
nil

But to really time a "ceil" function we should have premade random
numbers and avoid including their generation in the time. We'll also
get rid of some boxing and function call overheads:

user=> (let [nums (double-array (repeatedly 1000000 rand))]
  (time
    (dotimes [i 1000000] (Math/ceil (aget nums i)))))
"Elapsed time: 47.99892 msecs"
nil

Now the only things in the timing loop are: counting to 1 million,
aget from a primitive array, and Math/ceil itself. That's about as
good as it's gonna get.

Substitute calls to other ceil implementations as appropriate.

Oh, and by the way, (int x) is not quite floor either:

user=> (int -2.1)
-2

It truncates towards 0 rather than -infinity.

#(quot % 1) does the same thing (and is slower by nearly a factor of 10).

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