summaryrefslogtreecommitdiff
path: root/src/benchmark.clj
blob: 5573e5603eadf74d54f3aaba39cfd49c75cd2574 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
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))