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