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))
|