diff options
Diffstat (limited to 'src/benchmark.clj')
| -rwxr-xr-x | src/benchmark.clj | 65 |
1 files changed, 65 insertions, 0 deletions
diff --git a/src/benchmark.clj b/src/benchmark.clj new file mode 100755 index 0000000..5573e56 --- /dev/null +++ b/src/benchmark.clj @@ -0,0 +1,65 @@ +(ns benchmark + (:import java.lang.System + java.util.Random) + (:use compojure + clojure.contrib.json.write)) + +(defstruct user-struct :nick :last-seen) +(defstruct message-struct :nick :content :timestamp) + +(def room-limit 100) +(def message-log-size 100) + +(def users (ref {})) +(def messages (ref [])) + +(def random (new Random)) + +;define characters list to use to generate string +(def chars + (map char (concat (range 48 58) (range 66 92) (range 97 123)))) + +;generates 1 random character +(defn random-char [] + (nth chars (.nextInt random (count chars)))) + +; generates random string of length characters +(defn random-string [length] + (apply str (take length (repeatedly random-char)))) + +(defn pick [s] + (nth (seq s) + (. random nextInt (count s)))) + +(defn add-user [] + (dosync + (if (= (count @users) room-limit) + (let [loser (pick (keys @users))] + (alter users dissoc loser))) + (let [nick (random-string 10)] + (alter users assoc nick (struct user-struct nick (System/currentTimeMillis))) + (json-str {"users" (keys @users) "messages" (reverse @messages)})))) + +(defn post-message [] + (dosync + (let [nick (pick (keys @users)) + msg (random-string 30)] + (ref-set messages (conj (take (- 100 1) @messages) + (struct message-struct nick msg (System/currentTimeMillis)))) + (alter users assoc-in [nick :last-seen] (System/currentTimeMillis)) + (json-str "OK")))) + +(defn do-bench [] + (let [r (.nextDouble random)] + (if (or (= 0 (count @users)) (< r 0.1)) + (add-user) + (post-message)))) + + +(defroutes benchmark + (ANY "*" (do-bench))) + + + +(run-server {:port 8080} + "/*" (servlet benchmark))
\ No newline at end of file |
