On Fri, Nov 28, 2008 at 9:38 AM, Michael Wood <[EMAIL PROTECTED]> wrote:
>
> I imagine counting characters in a string will be quicker than setting
> up a bunch of pointers or copying a bunch of characters and then
> garbage collecting them again.
>
> They might both be O(1), but one O(1) is still likely bigger than the other :)

It's easy enough to measure:

user=> (def s (apply str (replicate 1000 \x)))
#'user/s
user=> (time (dotimes [_ 1000000] (seq s)))
"Elapsed time: 96.660809 msecs"
nil
user=> (time (dotimes [_ 1000000] (empty? s)))
"Elapsed time: 100.079805 msecs"
nil
user=> (time (dotimes [_ 1000000] (== 0 (count s))))
"Elapsed time: 67.824077 msecs"
nil

You can also test with s as an empty string.  A string thats 1000
chars long doesn't appear to be any slower (certainly not 1000 times
slower) than an empty string, for any of the methods.  This
demonstrates O(1) for all of them and also suggests that seq is not
doing anything "for each character".  This is what you should expect,
since seq is a view it doesn't ever copy whole data structures.

count does seem to be a bit faster than seq or empty.  I'm guessing
this is because it doesn't have to allocate a new object the way seq
may have to.  If you're doing a million of these tests, is the 0.01
seconds it costs to do (seq 0) over (== 0 (count s)) really worth the
extra set of nesting parens, the doubling of character, and the
doubling of the number of symbols?  Personally, I would say no.  And
if you're doing fewer than a million, it's certainly not worth it.

So write code for the programmer rather than the computer -- write it
the way that will be the easiest for yourself and future maintainers
to understand.

--Chouser

--~--~---------~--~----~------------~-------~--~----~
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
To unsubscribe from this group, send email to [EMAIL PROTECTED]
For more options, visit this group at 
http://groups.google.com/group/clojure?hl=en
-~----------~----~----~----~------~----~------~--~---

Reply via email to