summaryrefslogtreecommitdiff
path: root/src/benchmark.clj
blob: 3adf8439d6e4f0d317fc41a5d2c34634bd868bc7 (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
66
67
68
69
70
71
72
73
74
(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 refresh []
  (dosync
   {"users" (keys @users) "messages" @messages}))

(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)))
     {"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))
     "OK")))
     

(defn do-bench []
  (let [r (.nextDouble random)]
    (cond (< r 0.8) (json-str (refresh))
	  (< r 0.9) (json-str (add-user))
	  (< r 1) (json-str (post-message)))))
 
(defn hello-world []
  "hello world!")

(defroutes benchmark
  (GET "/hello" (hello-world))
  (ANY "*" (do-bench)))

(add-user)

(run-server {:port 8080}
  "/*" (servlet benchmark))