summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rwxr-xr-xsrc/benchmark.clj65
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