[webkit-dev] Feature Announcement: Moving HTML Parser off the Main Thread
Filip Pizlo
fpizlo at apple.com
Thu Jan 10 00:18:25 PST 2013
Hi Zoltan,
I would be curious how you did the synchronization. I've had some luck reducing synchronization costs before.
Was the patch ever uploaded anywhere?
-F
On Jan 10, 2013, at 12:11 AM, Zoltan Herczeg <zherczeg at webkit.org> wrote:
> Parsing, especially JS parsing still takes a large amount of time on page
> loading. We tried to improve the preload scanner by moving it into
> anouther thread, but there was no gain (except some special cases).
> Synchronization between threads is surprisingly (ridiculously) costly,
> usually worth for those tasks, which needs quite a few million
> instructions to be executed (and tokenization takes far less in most
> cases). For smaller tasks, SIMD instruction sets can help, which is
> basically a parallel execution on a single thread. Anyway it is worth
> trying, but it is really challenging to make it work in practice. Good
> luck!
>
> Regards,
> Zoltan
>
>> On Jan 9, 2013, at 10:04 PM, Ian Hickson <ian at hixie.ch> wrote:
>>
>>> On Wed, 9 Jan 2013, Eric Seidel wrote:
>>>>
>>>> The core goal is to reduce latency -- to free up the main thread for
>>>> JavaScript and UI interaction -- which as you correctly note, cannot be
>>>> moved off of the main thread due to the "single thread of execution"
>>>> model of the web.
>>>
>>> Parsing and (maybe to a lesser extent) compiling JS can be moved off the
>>> main thread, though, right? That's probably worth examining too, if it
>>> hasn't already been done.
>>
>> 100% agree.
>>
>> However, the same problem I brought up about tokenization applies here: a
>> lot of JS functions are super cheap to parse and compile already, and the
>> latency of doing so on the main thread is likely to be lower than the
>> latency of chatting with another core. I suspect this could be alleviated
>> by (1) aggressively pipelining the work, where during page load or during
>> heavy JS use the compilation thread always has a non-empty queue of work
>> to do; this will mean that the latency of communication is paid only when
>> the first compilation occurs, and (2) allowing the main thread to steal
>> work from the compilation queue. I'm not sure how to make (2) work well.
>> For parsing it's actually harder since we rely heavily on the lazy parsing
>> optimization: code is only parsed once we need it *right now* to run a
>> function. For compilation, it's somewhat easier: the most expensive
>> compilation step is the third-tier optimizing JIT; we can delay this as
>> long as we want, though the longer we dela
>> y it, the longer we spend running slower code.
>>
>> Hence, to make parsing concurrent, the main problem is figuring out how to
>> do predictive parsing: have a concurrent thread start parsing something
>> just before we need it. Without predictive parsing, making it concurrent
>> would be a guaranteed loss since the main thread would just be stuck
>> waiting for the thread to finish.
>>
>> To make optimized compiles concurrent without a regression, the main
>> problem is ensuring that in those cases where we believe that the time
>> taken to compile the function will be smaller than the time taken to awake
>> the concurrent thread, we will instead just compile it on the main thread
>> right away. Though, if we could predict that a function was going to get
>> hot in the future, we could speculatively tell a concurrent thread to
>> compile it fully knowing that it won't wake up and do so until exactly
>> when we would have otherwise invoked the compiler on the main thread (that
>> is, it'll wake up and start compiling it once the main thread has executed
>> the function enough times to get good profiling data).
>>
>> Anyway, you're absolutely right that this is an area that should be
>> explored.
>>
>> -F
>>
>>
>>>
>>> --
>>> Ian Hickson U+1047E )\._.,--....,'``. fL
>>> http://ln.hixie.ch/ U+263A /, _.. \ _\ ;`._ ,.
>>> Things that are impossible just take longer. `._.-(,_..'--(,_..'`-.;.'
>>> _______________________________________________
>>> webkit-dev mailing list
>>> webkit-dev at lists.webkit.org
>>> http://lists.webkit.org/mailman/listinfo/webkit-dev
>>
>> _______________________________________________
>> webkit-dev mailing list
>> webkit-dev at lists.webkit.org
>> http://lists.webkit.org/mailman/listinfo/webkit-dev
>>
>
>
> _______________________________________________
> webkit-dev mailing list
> webkit-dev at lists.webkit.org
> http://lists.webkit.org/mailman/listinfo/webkit-dev
More information about the webkit-dev
mailing list