Try this: (def *valid-chars* [ \a \b \c \d \e \f \g \h \i \j \k \l \m \n \o \p \q \r \s \t \u \v \w \x \u \z \0 \1 \2 \3 \4 \5 \6 \7 \8 \9 ] )
(defn generate-key [keylength] (for [x (range keylength)] (nth *valid-chars* (rand-int (count *valid- chars*))))) (defn generate-random-keys [numkeys keylength] (for [x (range numkeys)] (generate-key keylength))) (time (into [] (generate-random-keys 100000 1024))) ;; 100k strings, 1024-chars each I get "Elapsed time: 384.562 msecs". (MacPro/2.66Ghz) I didn't check the memory usage and it may not be the most idiomatic clojure but it's a bit easier to read and understand. On Oct 30, 3:56 pm, Chick Corea <chick.zco...@gmail.com> wrote: > How do I make this code faster? And leaner, i.e., use less memory ? > > It's a simple function to generate NUMKEYS strings of length > KEYLENGTH, > store them in a Java array then store them in a HashMap<String,Object> > hash-map. [it doesn't store them in the hash-map yet; but it > allocates it] > > (set! *warn-on-reflection* true) > > (def *valid-chars* [ \a \b \c \d \e \f \g \h \i \j \k \l \m > \n \o \p \q \r \s \t \u \v \w \x \u \z > \0 \1 \2 \3 \4 \5 \6 \7 \8 \9 ] ) > > (defn generate-random-keys [ numkeys keylength ] > (time > (let [ rand (new java.util.Random) > key (make-array Character/TYPE keylength) ;; :initial- > element \a)) > keys (make-array String numkeys) > data (new java.util.HashMap (int numkeys)) > ] > (.println System/out (format "generating [%d] keys of length > [%d]" numkeys keylength )) > (dotimes [i numkeys] > (dotimes [j keylength] > (aset key j (nth *valid-chars* (. rand nextInt (int 36))))) > (let [tmp (String. #^chars key) ] > ;; (.println System/out (format "keys[%d] => [%s]" i > tmp)) > (aset keys i tmp))) > (.println System/out (format "inserting [%d] keys into HashMap" > numkeys))))) > > (generate-random-keys 100000 1024) ;; 100k strings, 1024-chars each > > The corresponding Java code (w/ the hash-insert omitted in the clojure > version) > runs in 5.5sec and uses 290MB. > > This code runs (which omits the hash-insert) runs in 17.8sec and uses > 353MB. > > I thought that I added all of the casts and "warn-on-reflections" that > would help. > Also, I thought using Java data structures directly would bypass some > of Clojure's > overhead. What am I missing? > > Granted, the initial memory allocated is > > * for POJ, ~12MB > * for Clojure, ~90MB > > That may or may not be relevant. It's hard to know w/ auto mem-mgmt. > > CHICKEE --~--~---------~--~----~------------~-------~--~----~ 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 -~----------~----~----~----~------~----~------~--~---