clojure-spec

2023-08-15T06:10:47.656629Z

Hello everyone 👋 I made this function to generate maps with a given depth and width:

(s/def ::any (s/or :s string? :i int?))

(defn map-gen [x y]
  (->> (repeatedly x  #(-> keyword?
                           s/gen
                           g/generate))
       (map (fn [k] [k (if (pos? y)
                         (map-gen x (dec y))
                         (-> ::any
                             s/gen
                             g/generate))]))
       (into {})))
but for some reason it is very slow, what am I misusing here?

pithyless 2023-08-16T08:14:08.963539Z

Your recursion is generating an exponentially increasing large map, so the time is also going to go up. For example: (map-gen 10 y) where y is 1 to 5 goes up in time:

y=1 "Elapsed time: 14.155375 msecs"
y=2 "Elapsed time: 50.327042 msecs"
y=3 "Elapsed time: 748.101916 msecs"
y=4 "Elapsed time: 2843.250333 msecs"
y=5 "Elapsed time: 28140.05775 msecs"

🙏 1
pithyless 2023-08-16T08:15:39.216159Z

So, it would be helpful if you specify how big are the maps you're generating, what kind of time you're seeing, and what kind of time you'd expect (since "slow" and "fast" are relative).