W3C home > Mailing lists > Public > whatwg@whatwg.org > August 2013

Re: [whatwg] asynchronous JSON.parse and sending large structured data between threads without compromising responsiveness

From: Boris Zbarsky <bzbarsky@MIT.EDU>
Date: Tue, 06 Aug 2013 22:11:19 -0400
Message-ID: <5201ACC7.3080300@mit.edu>
To: whatwg@lists.whatwg.org
On 8/6/13 5:58 PM, Ian Hickson wrote:
> One could imagine an implementation strategy where the cloning is done on
> the sending side, or even on a third thread altogether

The cloning needs to run to completion (in the sense of capturing an 
immutable representation) before anyone can change the data structure 
being cloned.

That means either serializing the whole data structure in some way 
before returning control to JS or doing something where you start 
serializing it async and block until finish as soon as someone tries to 
modify any of those objects in any way, right?

The latter is rather nontrivial to implement, so UAs do the former at 
the moment.

> Serialising is hard to do async, since you fundamentally have to walk the
> data structure, and the actual serialisation at that point is not
> especially more expensive than a copy.

Right, that's what I said above...  ;)

> Parsing is easy to do on a separate worker, because it has no dependencies -- you can
> do it all in isolation.

Sadly, that may not be the.

Actual JS implementations have various "thread-local" data that objects 
depend on (starting with interned property names), such that it's not 
actually possible to create an object on one thread and use it on 
another in many of them.

>> For instance, how would you serialize something as simple as the following?
>>
>> {
>>    name: "The One",
>>    hp: 1000,
>>    achievements: ["achiever", "overachiever", "extreme overachiever"]
>>     // Length of the list is unpredictable
>> }
>
> Why serialise it? If you want to post this across a MessagePort to a
> worker, or back from a worker, why not just post it?
>
>     var a = { ... }; // from above
>     port.postMessage(a);

This in practice does some sort of serialization in UAs.

> Assuming by "Firefox Desktop" you mean the browser for desktop OSes called
> Firefox, then, why not just do this in C++?

Let's start with "because writing C++ code without memory errors is 
harder than writing JS code without memory errors"?

> I don't understand why you
> would constrain yourself to using Web APIs in JavaScript to write a browser.

Simplicity of implementation?  Sandboxing of the code?  Eating your own 
dogfood?

I can come up with some more reasons if you want.

-Boris
Received on Wednesday, 7 August 2013 02:11:48 UTC

This archive was generated by hypermail 2.3.1 : Monday, 13 April 2015 23:09:23 UTC