diff options
| author | sostler <sbostler@gmail.com> | 2009-11-14 22:50:17 -0500 |
|---|---|---|
| committer | sostler <sbostler@gmail.com> | 2009-11-14 22:50:17 -0500 |
| commit | a9281a9b05f49e5beaa798b09538fa35e7635771 (patch) | |
| tree | fc7ecd0e8b8832e38bc4d3e2771221b4c012f5d5 | |
| parent | 2d15a65176b603b3123f38721859da677261d82d (diff) | |
Benchmark script
| -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 |
