Commit a2aa9c70 authored by Shubhie Panicker's avatar Shubhie Panicker Committed by Commit Bot

Add test variant for post message to/from worker.

This will be used for Off Main Thread: to benchmark payloads for
app models being validated.
Doc: https://docs.google.com/document/d/1SghPBAYxy04O58hBnQ4Mv1dSEXCwpliMMkZxlRZAL78/edit#

Change-Id: I32fb278ea69cd6c0f0889680462f5c973f64c6b3
Reviewed-on: https://chromium-review.googlesource.com/1149322
Commit-Queue: Shubhie Panicker <panicker@chromium.org>
Reviewed-by: default avatarKentaro Hara <haraken@chromium.org>
Cr-Commit-Position: refs/heads/master@{#578112}
parent 023ec560
const StructuredClonePerfTestRunner = (function() { const StructuredClonePerfTestRunner = (function() {
function pingPong(data) { function pingPong(data, useWorker) {
return new Promise((resolve, reject) => { return new Promise((resolve, reject) => {
let beginSerialize, endSerialize, beginDeserialize; let beginSerialize, endSerialize, beginDeserialize;
window.addEventListener('message', function listener(e) { if (useWorker) {
try { worker.addEventListener('message', function listener(e) {
e.data; // Force deserialization. try {
const endDeserialize = PerfTestRunner.now(); e.data; // Force deserialization.
window.removeEventListener('message', listener); const endDeserialize = PerfTestRunner.now();
resolve([endSerialize - beginSerialize, endDeserialize - beginDeserialize]); worker.removeEventListener('message', listener);
} catch (err) { reject(err); } resolve([endSerialize - beginSerialize, endDeserialize - beginDeserialize]);
}); } catch (err) { reject(err); }
});
} else {
window.addEventListener('message', function listener(e) {
try {
e.data; // Force deserialization.
const endDeserialize = PerfTestRunner.now();
window.removeEventListener('message', listener);
resolve([endSerialize - beginSerialize, endDeserialize - beginDeserialize]);
} catch (err) { reject(err); }
});
}
beginSerialize = PerfTestRunner.now(); beginSerialize = PerfTestRunner.now();
window.postMessage(data, '*'); if (useWorker) {
worker.postMessage(data);
} else {
window.postMessage(data, '*');
}
beginDeserialize = endSerialize = PerfTestRunner.now(); beginDeserialize = endSerialize = PerfTestRunner.now();
// While Chrome does the deserialize lazily when e.data is read, this // While Chrome does the deserialize lazily when e.data is read, this
// isn't portable, so it's more fair to measure from when the message is // isn't portable, so it's more fair to measure from when the message is
...@@ -22,6 +37,9 @@ const StructuredClonePerfTestRunner = (function() { ...@@ -22,6 +37,9 @@ const StructuredClonePerfTestRunner = (function() {
return { return {
measureTimeAsync(test) { measureTimeAsync(test) {
let isDone = false; let isDone = false;
if (test.worker) {
worker = new Worker('resources/worker-structured-clone.js');
}
PerfTestRunner.startMeasureValuesAsync({ PerfTestRunner.startMeasureValuesAsync({
description: test.description, description: test.description,
unit: 'ms', unit: 'ms',
...@@ -32,7 +50,7 @@ const StructuredClonePerfTestRunner = (function() { ...@@ -32,7 +50,7 @@ const StructuredClonePerfTestRunner = (function() {
}); });
function pingPongUntilDone() { function pingPongUntilDone() {
pingPong(test.data).then(([serializeTime, deserializeTime]) => { pingPong(test.data, test.worker).then(([serializeTime, deserializeTime]) => {
console.log([serializeTime, deserializeTime]); console.log([serializeTime, deserializeTime]);
if (test.measure === 'serialize') if (test.measure === 'serialize')
PerfTestRunner.measureValueAsync(serializeTime); PerfTestRunner.measureValueAsync(serializeTime);
......
self.onmessage = function(e) {
self.postMessage(e.data);
};
<!DOCTYPE html>
<body>
<script src="../resources/runner.js"></script>
<script src="resources/structured-clone-perf-test.js"></script>
<script>
StructuredClonePerfTestRunner.measureTimeAsync({
description: "Measures performance of serializing JSON-like data.",
data: JSON.parse(PerfTestRunner.loadFile("resources/blink-dev.json")),
measure: "serialize",
worker: true,
});
</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