vnc_perf.html 6.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209
  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 = "base64";
  33. </script>
  34. <script src="../include/util.js"></script>
  35. <script src="../include/playback.js"></script>
  36. <script src="../data/multi.js"></script>
  37. <script>
  38. // Load supporting scripts
  39. Util.load_scripts(["webutil.js", "base64.js", "websock.js", "des.js",
  40. "keysymdef.js", "keyboard.js", "input.js", "display.js",
  41. "rfb.js"]);
  42. var start_time, VNC_frame_data, pass, passes, encIdx,
  43. encOrder = ['raw', 'rre', 'hextile', 'tightpng', 'copyrect'],
  44. encTot = {}, encMin = {}, encMax = {},
  45. passCur, passTot, passMin, passMax;
  46. function msg(str) {
  47. console.log(str);
  48. var cell = $D('messages');
  49. cell.innerHTML += str + "\n";
  50. cell.scrollTop = cell.scrollHeight;
  51. }
  52. function dbgmsg(str) {
  53. if (Util.get_logging() === 'debug') {
  54. msg(str);
  55. }
  56. }
  57. updateState = function (rfb, state, oldstate, mesg) {
  58. switch (state) {
  59. case 'failed':
  60. case 'fatal':
  61. msg("noVNC sent '" + state +
  62. "' state during pass " + pass +
  63. ", iteration " + iteration +
  64. " frame " + frame_idx);
  65. test_state = 'failed';
  66. break;
  67. case 'loaded':
  68. $D('startButton').disabled = false;
  69. break;
  70. }
  71. if (typeof mesg !== 'undefined') {
  72. $D('VNC_status').innerHTML = mesg;
  73. }
  74. }
  75. function do_test() {
  76. $D('startButton').value = "Running";
  77. $D('startButton').disabled = true;
  78. mode = 'perftest'; // full-speed
  79. passes = $D('passes').value;
  80. pass = 1;
  81. encIdx = 0;
  82. // Render each encoding once for each pass
  83. iterations = 1;
  84. // Initialize stats counters
  85. for (i = 0; i < encOrder.length; i++) {
  86. enc = encOrder[i];
  87. encTot[i] = 0;
  88. encMin[i] = 2<<23; // Something sufficiently large
  89. encMax[i] = 0;
  90. }
  91. passCur = 0;
  92. passTot = 0;
  93. passMin = 2<<23;
  94. passMax = 0;
  95. // Fire away
  96. next_encoding();
  97. }
  98. function next_encoding() {
  99. var encName;
  100. if (encIdx >= encOrder.length) {
  101. // Accumulate pass stats
  102. if (passCur < passMin) {
  103. passMin = passCur;
  104. }
  105. if (passCur > passMax) {
  106. passMax = passCur;
  107. }
  108. msg("Pass " + pass + " took " + passCur + " ms");
  109. passCur = 0;
  110. encIdx = 0;
  111. pass += 1;
  112. if (pass > passes) {
  113. // We are finished
  114. // Shut-off event interception
  115. rfb.get_mouse().ungrab();
  116. rfb.get_keyboard().ungrab();
  117. $D('startButton').disabled = false;
  118. $D('startButton').value = "Start";
  119. finish_passes();
  120. return; // We are finished, terminate
  121. }
  122. }
  123. encName = encOrder[encIdx];
  124. dbgmsg("Rendering pass " + pass + " encoding '" + encName + "'");
  125. VNC_frame_data = VNC_frame_data_multi[encName];
  126. iteration = 0;
  127. start_time = (new Date()).getTime();
  128. next_iteration();
  129. }
  130. // Finished rendering current encoding
  131. function finish() {
  132. var total_time, end_time = (new Date()).getTime();
  133. total_time = end_time - start_time;
  134. dbgmsg("Encoding " + encOrder[encIdx] + " took " + total_time + "ms");
  135. passCur += total_time;
  136. passTot += total_time;
  137. // Accumulate stats
  138. encTot[encIdx] += total_time;
  139. if (total_time < encMin[encIdx]) {
  140. encMin[encIdx] = total_time;
  141. }
  142. if (total_time > encMax[encIdx]) {
  143. encMax[encIdx] = total_time;
  144. }
  145. encIdx += 1;
  146. next_encoding();
  147. }
  148. function finish_passes() {
  149. var i, enc, avg, passAvg;
  150. msg("STATS (for " + passes + " passes)");
  151. // Encoding stats
  152. for (i = 0; i < encOrder.length; i++) {
  153. enc = encOrder[i];
  154. avg = (encTot[i] / passes).toFixed(1);
  155. msg(" " + enc + ": " + encTot[i] + " ms, " +
  156. encMin[i] + "/" + avg + "/" + encMax[i] +
  157. " (min/avg/max)");
  158. }
  159. // Print pass stats
  160. passAvg = (passTot / passes).toFixed(1);
  161. msg("\n All passes: " + passTot + " ms, " +
  162. passMin + "/" + passAvg + "/" + passMax +
  163. " (min/avg/max)");
  164. }
  165. window.onscriptsload = function() {
  166. var i, enc;
  167. dbgmsg("Frame lengths:");
  168. for (i = 0; i < encOrder.length; i++) {
  169. enc = encOrder[i];
  170. dbgmsg(" " + enc + ": " + VNC_frame_data_multi[enc].length);
  171. }
  172. rfb = new RFB({'target': $D('VNC_canvas'),
  173. 'onUpdateState': updateState});
  174. rfb.testMode(send_array, VNC_frame_encoding);
  175. }
  176. </script>
  177. </html>