]>
Commit | Line | Data |
---|---|---|
f8990704 | 1 | <!DOCTYPE html> |
a679a97d JM |
2 | <html> |
3 | <head> | |
4 | <title>VNC Performance Benchmark</title> | |
a679a97d JM |
5 | </head> |
6 | <body> | |
7 | ||
8 | Passes: <input id='passes' style='width:50' value=3> | |
9 | ||
10 | <input id='startButton' type='button' value='Start' style='width:100px' | |
f8990704 | 11 | onclick="do_test();" disabled> |
a679a97d JM |
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 | <!-- | |
ae510306 | 34 | <script type='text/javascript' |
a679a97d JM |
35 | src='http://getfirebug.com/releases/lite/1.2/firebug-lite-compressed.js'></script> |
36 | --> | |
37 | ||
5e55378b | 38 | <script type="text/javascript"> |
ae510306 | 39 | var INCLUDE_URI= "../"; |
5e55378b | 40 | </script> |
ae510306 SR |
41 | <script src="../core/util.js"></script> |
42 | <script src="../app/webutil.js"></script> | |
a679a97d JM |
43 | |
44 | <script> | |
4ee55e01 SR |
45 | var fname = WebUtil.getQueryVar('data', null); |
46 | if (fname) { | |
47 | msg("Loading " + fname); | |
48 | ||
49 | // Load supporting scripts | |
72bdd06e | 50 | WebUtil.load_scripts({ |
bd5340c7 SR |
51 | 'core': ["base64.js", "websock.js", "des.js", "input/keysym.js", |
52 | "input/keysymdef.js", "input/xtscancodes.js", "input/util.js", | |
c1e2785f SM |
53 | "input/keyboard.js", "input/mouse.js", "display.js", "rfb.js", |
54 | "inflator.js", "input/vkeys.js", "input/fixedkeys.js"], | |
ae510306 SR |
55 | 'tests': ["playback.js"], |
56 | 'recordings': [fname]}); | |
4ee55e01 SR |
57 | } else { |
58 | msg("Must specifiy data=FOO.js in query string."); | |
59 | } | |
6f4b1e40 | 60 | |
a679a97d JM |
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); | |
ae510306 | 68 | var cell = document.getElementById('messages'); |
6048299a | 69 | cell.textContent += str + "\n"; |
a679a97d JM |
70 | cell.scrollTop = cell.scrollHeight; |
71 | } | |
72 | function dbgmsg(str) { | |
73 | if (Util.get_logging() === 'debug') { | |
74 | msg(str); | |
75 | } | |
76 | } | |
77 | ||
f9e26cdb PO |
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'; | |
a679a97d JM |
85 | } |
86 | } | |
87 | ||
f9e26cdb | 88 | notification = function (rfb, mesg, level, options) { |
6048299a | 89 | document.getElementById('VNC_status').textContent = mesg; |
f9e26cdb PO |
90 | } |
91 | ||
f8990704 | 92 | function do_test() { |
ae510306 SR |
93 | document.getElementById('startButton').value = "Running"; |
94 | document.getElementById('startButton').disabled = true; | |
a679a97d JM |
95 | |
96 | mode = 'perftest'; // full-speed | |
ae510306 | 97 | passes = document.getElementById('passes').value; |
a679a97d JM |
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 | |
13106063 JM |
138 | // Shut-off event interception |
139 | rfb.get_mouse().ungrab(); | |
140 | rfb.get_keyboard().ungrab(); | |
ae510306 SR |
141 | document.getElementById('startButton').disabled = false; |
142 | document.getElementById('startButton').value = "Start"; | |
a679a97d JM |
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, " + | |
ae510306 | 189 | encMin[i] + "/" + avg + "/" + encMax[i] + |
a679a97d JM |
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 | ||
6f4b1e40 | 200 | window.onscriptsload = function() { |
a679a97d JM |
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 | } | |
ae510306 | 207 | document.getElementById('startButton').disabled = false; |
a679a97d JM |
208 | } |
209 | </script> | |
210 | </html> |