| const StructuredClonePerfTestRunner = (function() { |
| function pingPong(data) { |
| return new Promise((resolve, reject) => { |
| let beginSerialize, endSerialize, beginDeserialize, endDeserialize; |
| window.addEventListener('message', function listener(e) { |
| try { |
| e.data; // Force deserialization. |
| endDeserialize = PerfTestRunner.now(); |
| window.removeEventListener('message', listener); |
| resolve([endSerialize - beginSerialize, endDeserialize - beginDeserialize]); |
| } catch (err) { reject(err); } |
| }); |
| |
| beginSerialize = PerfTestRunner.now(); |
| window.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; |
| 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]) => { |
| console.log([serializeTime, deserializeTime]); |
| if (test.measure === 'serialize') |
| PerfTestRunner.measureValueAsync(serializeTime); |
| else if (test.measure === 'deserialize') |
| PerfTestRunner.measureValueAsync(deserializeTime); |
| if (!isDone) pingPongUntilDone(); |
| }); |
| } |
| }, |
| }; |
| })(); |