vnc_perf.html 6.7 KB

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