vnc_perf.html 6.1 KB

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