Non-Blocking Asynchronous JSON.parse Using the Fetch API
azimi.me
azimi.me
Strange, according to MDN data sent to web workers needs only be deep clone-able[1]. Is this non-standard Gecko behavior?
> aMessage: This may be any value or JavaScript object handled by the structured clone algorithm, which includes cyclical references.
[1]: https://developer.mozilla.org/en-US/docs/Web/API/Worker/post...
https://html.spec.whatwg.org/multipage/workers.html#communic...
Here's a jsbin experiment that shows that the main thread is blocked while parsing JSON using the author's technique (tested in Chrome 44 and Firefox 41):
~34KB json string (1st run):
sync: total time (blocking): 0.412ms
async: blocking time: 1.822ms
async: total time: 3.943ms
➜ str.length
34527
~34KB json string (10th run): sync: total time (blocking): 0.569ms
async: blocking time: 0.438ms
async: total time: 2.336ms
~112KB json string (1st run): sync: total time (blocking): 1.217ms
async: blocking time: 1.036ms
async: total time: 4.818ms
➜ str.length
114745
~112KB json string (10th run): sync: total time (blocking): 1.658ms
async: blocking time: 0.683ms
async: total time: 4.444ms
Could do with some proper benchmarking by someone who knows more about benchmarking this stuff for real-world usage (i.e.. not me). By the way the 2nd - 10th run results were pretty similar, the amount of time that async function was blocking gradually decreased as it was run more often (I ran the ~34KB tests first).function asyncParse(string) { return new Promise(function(res, rej) { resolve(JSON.parse(string)); }); }
- or -
let asyncParse = async (string) => JSON.parse(string);