]> git.proxmox.com Git - mirror_novnc.git/blob - tests/vnc_perf.html
Merge branch 'api' of https://github.com/CendioOssman/noVNC
[mirror_novnc.git] / tests / vnc_perf.html
1 <!DOCTYPE html>
2 <html>
3 <head>
4 <title>VNC Performance Benchmark</title>
5 </head>
6 <body>
7
8 Passes: <input id='passes' style='width:50' value=3>&nbsp;
9
10 <input id='startButton' type='button' value='Start' style='width:100px'
11 onclick="do_test();" disabled>&nbsp;
12
13 <br><br>
14
15 Results:<br>
16 <textarea id="messages" style="font-size: 9;" cols=80 rows=15></textarea>
17
18 <br><br>
19
20 <div id="VNC_screen">
21 <div id="VNC_status_bar" class="VNC_status_bar" style="margin-top: 0px;">
22 <table border=0 width=100%><tr>
23 <td><div id="VNC_status">Loading</div></td>
24 </tr></table>
25 </div>
26 <canvas id="VNC_canvas" width="640px" height="20px">
27 Canvas not supported.
28 </canvas>
29 </div>
30
31 </body>
32
33 <!--
34 <script type='text/javascript'
35 src='http://getfirebug.com/releases/lite/1.2/firebug-lite-compressed.js'></script>
36 -->
37
38 <script type="text/javascript">
39 var INCLUDE_URI= "../";
40 </script>
41 <script src="../core/util.js"></script>
42 <script src="../app/webutil.js"></script>
43
44 <script>
45 var fname = WebUtil.getQueryVar('data', null);
46 if (fname) {
47 msg("Loading " + fname);
48
49 // Load supporting scripts
50 WebUtil.load_scripts({
51 'core': ["base64.js", "websock.js", "des.js", "input/keysym.js",
52 "input/keysymdef.js", "input/xtscancodes.js", "input/util.js",
53 "input/keyboard.js", "input/mouse.js", "display.js", "rfb.js",
54 "inflator.js", "input/vkeys.js", "input/fixedkeys.js"],
55 'tests': ["playback.js"],
56 'recordings': [fname]});
57 } else {
58 msg("Must specifiy data=FOO.js in query string.");
59 }
60
61 var start_time, VNC_frame_data, pass, passes, encIdx,
62 encOrder = ['raw', 'rre', 'hextile', 'tightpng', 'copyrect'],
63 encTot = {}, encMin = {}, encMax = {},
64 passCur, passTot, passMin, passMax;
65
66 function msg(str) {
67 console.log(str);
68 var cell = document.getElementById('messages');
69 cell.textContent += str + "\n";
70 cell.scrollTop = cell.scrollHeight;
71 }
72 function dbgmsg(str) {
73 if (Util.get_logging() === 'debug') {
74 msg(str);
75 }
76 }
77
78 disconnected = function (rfb, reason) {
79 if (reason) {
80 msg("noVNC sent '" + state +
81 "' state during pass " + pass +
82 ", iteration " + iteration +
83 " frame " + frame_idx);
84 test_state = 'failed';
85 }
86 }
87
88 notification = function (rfb, mesg, level, options) {
89 document.getElementById('VNC_status').textContent = mesg;
90 }
91
92 function do_test() {
93 document.getElementById('startButton').value = "Running";
94 document.getElementById('startButton').disabled = true;
95
96 mode = 'perftest'; // full-speed
97 passes = document.getElementById('passes').value;
98 pass = 1;
99 encIdx = 0;
100
101 // Render each encoding once for each pass
102 iterations = 1;
103
104 // Initialize stats counters
105 for (i = 0; i < encOrder.length; i++) {
106 enc = encOrder[i];
107 encTot[i] = 0;
108 encMin[i] = 2<<23; // Something sufficiently large
109 encMax[i] = 0;
110 }
111 passCur = 0;
112 passTot = 0;
113 passMin = 2<<23;
114 passMax = 0;
115
116 // Fire away
117 next_encoding();
118 }
119
120 function next_encoding() {
121 var encName;
122
123 if (encIdx >= encOrder.length) {
124 // Accumulate pass stats
125 if (passCur < passMin) {
126 passMin = passCur;
127 }
128 if (passCur > passMax) {
129 passMax = passCur;
130 }
131 msg("Pass " + pass + " took " + passCur + " ms");
132
133 passCur = 0;
134 encIdx = 0;
135 pass += 1;
136 if (pass > passes) {
137 // We are finished
138 // Shut-off event interception
139 rfb.get_mouse().ungrab();
140 rfb.get_keyboard().ungrab();
141 document.getElementById('startButton').disabled = false;
142 document.getElementById('startButton').value = "Start";
143 finish_passes();
144 return; // We are finished, terminate
145 }
146 }
147
148 encName = encOrder[encIdx];
149 dbgmsg("Rendering pass " + pass + " encoding '" + encName + "'");
150
151 VNC_frame_data = VNC_frame_data_multi[encName];
152 iteration = 0;
153 start_time = (new Date()).getTime();
154
155 next_iteration();
156 }
157
158 // Finished rendering current encoding
159 function finish() {
160 var total_time, end_time = (new Date()).getTime();
161 total_time = end_time - start_time;
162
163 dbgmsg("Encoding " + encOrder[encIdx] + " took " + total_time + "ms");
164
165 passCur += total_time;
166 passTot += total_time;
167
168 // Accumulate stats
169 encTot[encIdx] += total_time;
170 if (total_time < encMin[encIdx]) {
171 encMin[encIdx] = total_time;
172 }
173 if (total_time > encMax[encIdx]) {
174 encMax[encIdx] = total_time;
175 }
176
177 encIdx += 1;
178 next_encoding();
179 }
180
181 function finish_passes() {
182 var i, enc, avg, passAvg;
183 msg("STATS (for " + passes + " passes)");
184 // Encoding stats
185 for (i = 0; i < encOrder.length; i++) {
186 enc = encOrder[i];
187 avg = (encTot[i] / passes).toFixed(1);
188 msg(" " + enc + ": " + encTot[i] + " ms, " +
189 encMin[i] + "/" + avg + "/" + encMax[i] +
190 " (min/avg/max)");
191
192 }
193 // Print pass stats
194 passAvg = (passTot / passes).toFixed(1);
195 msg("\n All passes: " + passTot + " ms, " +
196 passMin + "/" + passAvg + "/" + passMax +
197 " (min/avg/max)");
198 }
199
200 window.onscriptsload = function() {
201 var i, enc;
202 dbgmsg("Frame lengths:");
203 for (i = 0; i < encOrder.length; i++) {
204 enc = encOrder[i];
205 dbgmsg(" " + enc + ": " + VNC_frame_data_multi[enc].length);
206 }
207 document.getElementById('startButton').disabled = false;
208 }
209 </script>
210 </html>