Run performance tests at full speed

setTimeout() is subject to delays, possible massive ones. As such it
is rather useless for performance sensitive code. Use the non-standard
setImmediate() API instead, emulating it on postMessage() when it
isn't available.
This commit is contained in:
Pierre Ossman 2016-10-24 17:37:21 +02:00
parent 7632c576f0
commit e12e2759b0
1 changed files with 37 additions and 1 deletions

View File

@ -19,6 +19,42 @@ send_array = function (arr) {
// Stub out send_array // Stub out send_array
}; };
// Immediate polyfill
if (window.setImmediate === undefined) {
var _immediateIdCounter = 1;
var _immediateFuncs = {};
window.setImmediate = function (func) {
var index = Util._immediateIdCounter++;
_immediateFuncs[index] = func;
window.postMessage("noVNC immediate trigger:" + index, "*");
return index;
};
window.clearImmediate = function (id) {
_immediateFuncs[id];
};
var _onMessage = function (event) {
if ((typeof event.data !== "string") ||
(event.data.indexOf("noVNC immediate trigger:") !== 0)) {
return;
}
var index = event.data.slice("noVNC immediate trigger:".length);
var callback = _immediateFuncs[index];
if (callback === undefined) {
return;
}
delete _immediateFuncs[index];
callback();
};
window.addEventListener("message", _onMessage);
}
enable_test_mode = function () { enable_test_mode = function () {
rfb._sock.send = send_array; rfb._sock.send = send_array;
rfb._sock.close = function () {}; rfb._sock.close = function () {};
@ -108,7 +144,7 @@ queue_next_packet = function () {
setTimeout(do_packet, delay); setTimeout(do_packet, delay);
} else { } else {
setTimeout(do_packet, 0); window.setImmediate(do_packet);
} }
}; };