Commit 336adf22 authored by Shubhie Panicker's avatar Shubhie Panicker Committed by Commit Bot

Add benchmark for worker round-trip.

This includes 2 thread hops, 2 serialize, 2 deserialize:
serialize + hop-to-worker + deserialize + serialize +
hop-to-main + deserialize.

Bug: 870041
Change-Id: I324ba46f09ab18522e51430c6d58c4f07001bc74
Reviewed-on: https://chromium-review.googlesource.com/1159321Reviewed-by: default avatarKentaro Hara <haraken@chromium.org>
Reviewed-by: default avatarJeremy Roman <jbroman@chromium.org>
Commit-Queue: Shubhie Panicker <panicker@chromium.org>
Cr-Commit-Position: refs/heads/master@{#581407}
parent 098695f5
const StructuredClonePerfTestRunner = (function() { const StructuredClonePerfTestRunner = (function() {
function pingPong(data, useWorker) { function pingPong(data) {
return new Promise((resolve, reject) => { return new Promise((resolve, reject) => {
let beginSerialize, endSerialize, beginDeserialize; let beginSerialize, endSerialize, beginDeserialize, endDeserialize;
if (useWorker) { window.addEventListener('message', function listener(e) {
worker.addEventListener('message', function listener(e) { try {
try { e.data; // Force deserialization.
e.data; // Force deserialization. endDeserialize = PerfTestRunner.now();
const endDeserialize = PerfTestRunner.now(); window.removeEventListener('message', listener);
worker.removeEventListener('message', listener); resolve([endSerialize - beginSerialize, endDeserialize - beginDeserialize]);
resolve([endSerialize - beginSerialize, endDeserialize - beginDeserialize]); } catch (err) { reject(err); }
} 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();
if (useWorker) { window.postMessage(data, '*');
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
...@@ -37,9 +23,6 @@ const StructuredClonePerfTestRunner = (function() { ...@@ -37,9 +23,6 @@ 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',
...@@ -50,7 +33,7 @@ const StructuredClonePerfTestRunner = (function() { ...@@ -50,7 +33,7 @@ const StructuredClonePerfTestRunner = (function() {
}); });
function pingPongUntilDone() { function pingPongUntilDone() {
pingPong(test.data, test.worker).then(([serializeTime, deserializeTime]) => { pingPong(test.data).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);
......
const WorkerStructuredClonePerfTestRunner = (function() {
function pingPong(data) {
return new Promise((resolve, reject) => {
let beginSerialize, endSerialize, beginDeserialize, endDeserialize;
worker.addEventListener('message', function listener(e) {
try {
e.data; // Force deserialization.
endDeserialize = PerfTestRunner.now();
worker.removeEventListener('message', listener);
// TODO(panicker): Deserialize is currently including worker hop and
// not accurate. Report this from the worker.
resolve([endSerialize - beginSerialize, endDeserialize - beginDeserialize,
endDeserialize - beginSerialize]);
} catch (err) { reject(err); }
});
beginSerialize = PerfTestRunner.now();
worker.postMessage(data);
beginDeserialize = endSerialize = PerfTestRunner.now();
// 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
// posted.
});
}
return {
measureTimeAsync(test) {
let isDone = false;
worker = new Worker('resources/worker-structured-clone.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(([serializeTime, deserializeTime, totalTime]) => {
console.log([serializeTime, deserializeTime, totalTime]);
if (test.measure === 'serialize')
PerfTestRunner.measureValueAsync(serializeTime);
else if (test.measure === 'deserialize')
PerfTestRunner.measureValueAsync(deserializeTime);
else if (test.measure === 'roundtrip')
PerfTestRunner.measureValueAsync(totalTime);
if (!isDone) pingPongUntilDone();
});
}
},
};
})();
<!DOCTYPE html>
<body>
<script src="../resources/runner.js"></script>
<script src="resources/worker-structured-clone-perf-test.js"></script>
<script>
WorkerStructuredClonePerfTestRunner.measureTimeAsync({
description: "Measures performance of worker round-trip with structured clone, for JSON-like data.",
data: JSON.parse(PerfTestRunner.loadFile("resources/blink-dev.json")),
measure: "roundtrip",
});
</script>
</body>
<!DOCTYPE html> <!DOCTYPE html>
<body> <body>
<script src="../resources/runner.js"></script> <script src="../resources/runner.js"></script>
<script src="resources/structured-clone-perf-test.js"></script> <script src="resources/worker-structured-clone-perf-test.js"></script>
<script> <script>
StructuredClonePerfTestRunner.measureTimeAsync({ WorkerStructuredClonePerfTestRunner.measureTimeAsync({
description: "Measures performance of serializing JSON-like data.", description: "Measures performance of serializing JSON-like data.",
data: JSON.parse(PerfTestRunner.loadFile("resources/blink-dev.json")), data: JSON.parse(PerfTestRunner.loadFile("resources/blink-dev.json")),
measure: "serialize", measure: "serialize",
worker: true,
}); });
</script> </script>
</body> </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