Skip to content

Commit 4f2537a

Browse files
committed
add uptime bench
1 parent b3cc0ef commit 4f2537a

File tree

1 file changed

+195
-0
lines changed

1 file changed

+195
-0
lines changed

benchmarks/uptime/index.html

Lines changed: 195 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,195 @@
1+
<!DOCTYPE html>
2+
<html lang="en">
3+
<head>
4+
<meta charset="utf-8">
5+
<title>Vue benchmark</title>
6+
<style type="text/css">
7+
html, body {
8+
margin: 0;
9+
padding: 0;
10+
font-family: sans-serif;
11+
}
12+
13+
#fps {
14+
position: fixed;
15+
top: 0px;
16+
right: 0px;
17+
padding: 32px;
18+
font-size: 32px;
19+
text-align: right;
20+
}
21+
22+
* {
23+
box-sizing: border-box;
24+
}
25+
26+
.server-uptime {
27+
display: block;
28+
overflow: hidden;
29+
margin: 0 auto;
30+
width: 50%;
31+
}
32+
33+
.server-uptime + .server-uptime {
34+
margin: 20px auto 0 auto;
35+
border-top: 1px solid #999;
36+
}
37+
38+
.days {
39+
display: flex;
40+
flex-direction: row;
41+
flex-flow: wrap;
42+
}
43+
44+
.uptime-day {
45+
display: flex;
46+
}
47+
48+
span.uptime-day-status {
49+
width: 10px;
50+
height: 10px;
51+
margin: 1px;
52+
}
53+
54+
.hover {
55+
display: none;
56+
}
57+
58+
.uptime-day-status:hover + .hover {
59+
display: flex;
60+
position: absolute;
61+
margin-top: -35px;
62+
margin-left: -30px;
63+
border-radius: 4px;
64+
color: #eee;
65+
background-color: #333;
66+
padding: 10px;
67+
font-size: 11px;
68+
}
69+
</style>
70+
</head>
71+
<body>
72+
<div id="app">
73+
<p>FPS: {{ fps }}</p>
74+
<button @click="toggle">{{ playing ? 'pause' : 'play' }}</button>
75+
<server-uptime
76+
v-for="server in servers"
77+
:key="server.name"
78+
:name="server.name"
79+
:days="server.days">
80+
</server-uptime>
81+
</div>
82+
<script src="../../dist/vue.min.js"></script>
83+
<script>
84+
Vue.component('uptime-day', {
85+
props: ['day'],
86+
template: `
87+
<div class="uptime-day">
88+
<span class="uptime-day-status" :style="{ backgroundColor: day.up ? '#8cc665' : '#ccc' }"></span>
89+
<span class="hover">{{day.number}}: {{day.up ? 'Servers operational!' : 'Red alert!'}}</span>
90+
</div>
91+
`
92+
})
93+
94+
Vue.component('server-uptime', {
95+
props: ['name', 'days'],
96+
computed: {
97+
upDays () {
98+
return this.days.reduce(function (upDays, day) {
99+
return upDays += (day.up ? 1 : 0)
100+
}, 0)
101+
},
102+
maxStreak () {
103+
var streak = this.days.reduce(([max, streak], day) => {
104+
if (day.up && streak + 1 > max) {
105+
return [streak + 1, streak + 1]
106+
} else if (day.up) {
107+
return [max, streak + 1]
108+
} else {
109+
return [max, 0]
110+
}
111+
}, [0, 0])
112+
113+
return streak.max
114+
}
115+
},
116+
template: `
117+
<div class="server-uptime">
118+
<h1>{{name}}</h1>
119+
<h2>{{upDays}} Days Up</h2>
120+
<h2>Biggest Streak: {{maxStreak}}</h2>
121+
<div class="days">
122+
<uptime-day
123+
v-for="day in days"
124+
:key="day.number"
125+
:day="day">
126+
</uptime-day>
127+
</div>
128+
</div>
129+
`
130+
})
131+
132+
function generateServer (name) {
133+
var days = []
134+
for (var i=0; i<=364; i++) {
135+
var up = Math.random() > 0.2
136+
days.push({ number: i, up })
137+
}
138+
return { name, days }
139+
}
140+
141+
function generateServers () {
142+
return [
143+
generateServer("Stefan's Server"),
144+
generateServer("Godfrey's Server"),
145+
generateServer("Yehuda's Server")
146+
]
147+
}
148+
149+
var s = window.performance.now()
150+
var app = new Vue({
151+
el: '#app',
152+
data: {
153+
fps: 0,
154+
playing: false,
155+
servers: Object.freeze(generateServers())
156+
},
157+
methods: {
158+
toggle () {
159+
this.playing = !this.playing
160+
if (this.playing) {
161+
update()
162+
} else {
163+
cancelAnimationFrame(loop)
164+
}
165+
}
166+
}
167+
})
168+
console.log('initial render: ' + (window.performance.now() - s) + 'ms')
169+
170+
var fpsMeter = {
171+
alpha: 2/121,
172+
lastValue: null,
173+
push (dataPoint) {
174+
if (this.lastValue) {
175+
return this.lastValue = this.lastValue + this.alpha * (dataPoint - this.lastValue)
176+
} else {
177+
return this.lastValue = dataPoint
178+
}
179+
}
180+
}
181+
182+
var loop
183+
var lastFrame = null
184+
function update () {
185+
var thisFrame = window.performance.now()
186+
if (lastFrame) {
187+
app.fps = Math.round(fpsMeter.push(1000 / (thisFrame - lastFrame)))
188+
}
189+
app.servers = Object.freeze(generateServers())
190+
loop = requestAnimationFrame(update)
191+
lastFrame = thisFrame
192+
}
193+
</script>
194+
</body>
195+
</html>

0 commit comments

Comments
 (0)