Commit 8f897a46 authored by Katie Dillon's avatar Katie Dillon Committed by Commit Bot

Worker transferable perf tests.

Adding perf tests for transferable data. Measures sending transferable
data to a worker from the main thread, from the main thread to a worker,
and the roundtrip time. Transferable data for this test is an image
represented as an array buffer.

Change-Id: Ie9f05a5301398b2f11677a2a57c985992b64541a
Reviewed-on: https://chromium-review.googlesource.com/c/1275365Reviewed-by: default avatarShubhie Panicker <panicker@chromium.org>
Reviewed-by: default avatarKentaro Hara <haraken@chromium.org>
Reviewed-by: default avatarJeremy Roman <jbroman@chromium.org>
Commit-Queue: Katie Dillon <kdillon@chromium.org>
Cr-Commit-Position: refs/heads/master@{#599664}
parent 2de299c3
const WorkerTransferablePerfTestRunner = (function() {
function pingPong(data) {
return new Promise((resolve, reject) => {
let sendData, mainThreadBeginTransfer, workerEndTransfer, toWorkerTime, fromWorkerTime, totalTime;
worker.addEventListener('message', function listener(e) {
try {
e.data.data;
workerEndTransfer = performance.now();
worker.removeEventListener('message', listener);
// toWorkerTime: Time for the main thread to transfer data to the worker
toWorkerTime = (e.data.mainThreadEndTransfer + (e.data.workerTimeOrigin - performance.timeOrigin)) - mainThreadBeginTransfer;
// fromWorkerTime: Time for the worker to transfer data back to the main thread
fromWorkerTime = workerEndTransfer - (e.data.mainThreadEndTransfer + (e.data.workerTimeOrigin - performance.timeOrigin));
// totalTime: Time from main thread beginning transfer to the end of the worker transfer
totalTime = workerEndTransfer - mainThreadBeginTransfer
resolve([toWorkerTime, fromWorkerTime, totalTime]);
} catch (err) { reject(err); }
});
sendData = data.slice(0); // Copy the data for every new transfer
mainThreadBeginTransfer = performance.now();
worker.postMessage({"data" : sendData}, [sendData]);
});
}
return {
measureTimeAsync(test) {
let isDone = false;
worker = new Worker('resources/worker-transferable.js');
PerfTestRunner.startMeasureValuesAsync({
description: test.description,
unit: 'ms',
warmUpCount: test.warmUpCount || 10,
iterationCount: test.iterationCount || 250,
done() { isDone = true;},
run: pingPongUntilDone,
});
function pingPongUntilDone() {
pingPong(test.data).then(([toWorkerTime, fromWorkerTime, totalTime]) => {
console.log([toWorkerTime, fromWorkerTime, totalTime]);
if (test.measure == 'toWorker')
PerfTestRunner.measureValueAsync(toWorkerTime);
else if (test.measure === 'fromWorker')
PerfTestRunner.measureValueAsync(fromWorkerTime);
else if (test.measure == 'roundtrip')
PerfTestRunner.measureValueAsync(totalTime);
if (!isDone) pingPongUntilDone();
});
}
},
};
})();
self.onmessage = function(e) {
var data = e.data.data;
var mainThreadEndTransfer = performance.now();
self.postMessage({'data' : data,
'workerTimeOrigin' : performance.timeOrigin,
'mainThreadEndTransfer' : mainThreadEndTransfer},
[data]);
};
<!DOCTYPE html>
<body>
<script src="../resources/runner.js"></script>
<script src="resources/worker-transferable-perf-test.js"></script>
<script>
var data = new Uint32Array(10485760);
for (var i = 0; i < data.length; i++) { data[i] = i; }
WorkerTransferablePerfTestRunner.measureTimeAsync({
description: "Measures performance of sending an array buffer as a transferable to the main thread from a worker.",
data: data.buffer,
measure: "fromWorker",
});
</script>
</body>
<!DOCTYPE html>
<body>
<script src="../resources/runner.js"></script>
<script src="resources/worker-transferable-perf-test.js"></script>
<script>
var data = new Uint32Array(10485760);
for (var i = 0; i < data.length; i++) { data[i] = i; }
WorkerTransferablePerfTestRunner.measureTimeAsync({
description: "Measures performance of worker round-trip using transferable to send an array buffer.",
data: data.buffer,
measure: "roundtrip",
});
</script>
</body>
<!DOCTYPE html>
<body>
<script src="../resources/runner.js"></script>
<script src="resources/worker-transferable-perf-test.js"></script>
<script>
var data = new Uint32Array(10485760);
for (var i = 0; i < data.length; i++) { data[i] = i; }
WorkerTransferablePerfTestRunner.measureTimeAsync({
description: "Measures performance of sending an array buffer as a transferable to a worker.",
data: data.buffer,
measure: "toWorker",
});
</script>
</body>
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment