- From: Annie Sullivan <sullivan@chromium.org>
- Date: Tue, 28 Jun 2011 16:41:25 -0700
- To: Jason Weber <jweber@microsoft.com>
- Cc: "public-web-perf@w3.org" <public-web-perf@w3.org>, Jatinder Mann <jmann@microsoft.com>
- Message-ID: <BANLkTi=bieaOJg78kK8xGUJyXhDwEPWLM+h1hm1Kc1cJEB+yYw@mail.gmail.com>
Hi Jason, I have a high-level question about the goal of efficient yielding. You say the goal is to allow breaking apart long-running scripts, and you give examples like bubble-sorting without blocking the UI. Isn't this the same goal as the web workers spec ( http://www.whatwg.org/specs/web-apps/current-work/complete/workers.html)? Can you clarify the use cases met by efficient yielding and not web workers? Thanks, Annie On Tue, Jun 28, 2011 at 3:17 PM, Jason Weber <jweber@microsoft.com> wrote: > One of the deliverables that we took on as part of the expanded Web > Performance Working Group was to find a way to allow javascript applications > to more efficiently yield control to the host (browser) and receive > immediate callbacks when the host has completed processing pending work (for > example handling user input of document layouts).**** > > ** ** > > We had the action item to summarize the motivations for the Efficient > Script Yielding deliverable, which we’re doing through this email, and to > publish the first editors draft which can be found here: > http://dvcs.w3.org/hg/webperf/raw-file/tip/specs/setImmediate/Overview.html > **** > > ** ** > > As the working group has discussed, we believe there’s an opportunity for a > new API that allows the web developers to (1) efficiently use the CPU > without wasted cycles, (2) efficiently use the CPU in bursts to conserve > power, (3) improve performance for end user scenarios, and (4) feels > familiar to current API’s and programming patterns.**** > > ** ** > > Today we see setTimeout and setInterval used for three primary patterns:** > ** > > ** ** > > **1) **Scheduling distant future callbacks (at least 500ms)**** > > **2) **JavaScript Based Animation**** > > **3) **Breaking apart long running scripts.**** > > ** ** > > We think about #1 as the cases where the current setTimeout pattern works > well. For example, you may want to update stock quotes or check for new > email on a regular schedule. The problems with #2 are well understood and > the working group has a great proposal in place with requestAnimationFrame. > The “efficient yielding” deliverable is intended to more efficiently solve > scenario #3.**** > > ** ** > > Today, browsers don’t process events while long running scripts are > executing. This includes everything from UI updates, to user input, to end > user features like spell checking. Even though the JavaScript may be > manipulating the DOM or updating styles, these updates aren’t presented to > the user until after the script yields. To allow applications to remain > responsive and to process visual changes, web developers are forced to > sprinkle setTimeouts throughout their code allowing the browser to process > pending work and then call script back at a future time.**** > > ** ** > > The setTimeout callback frequency on Windows has traditionally been around > 64 callbacks a second which aligns with the 15.6ms timer frequency. The > HTML5 specification recommends 250 callbacks a second which means a 4ms > timer frequency. This positively improves the perceived performance around > pattern #3 however it comes at the cost of actual performance (interference) > and more importantly power consumption. We’ve measured this extensively on > Windows and decreasing the timer frequency from 15.6ms to 4ms impacts > battery life by around 22% for common customer scenarios. This is a hardware > factor and not specific to Windows. And as we consider forward looking > hardware trends we expect this to become more of an issue.**** > > ** ** > > Decreasing timer resolutions may help with some patterns, however it > doesn’t fully solve the underlying problem. If you think about the bubble > sorting example, a developer doesn’t actually know how long a single pass > will take. To keep the browser responsive they yield frequently, often > during each sorting pass. If a modern script engine can perform that pass in > 1ms that means 3ms or 75% of the CPU time are wasted and not available to > the web developer.**** > > ** ** > > That’s why we believe there’s an opportunity for an API that allows the web > developers to (1) efficiently use the CPU without wasted cycles, (2) > efficiently use the CPU in bursts to conserve power, (3) improve performance > for end user scenarios, and (4) feels familiar to current API’s and > programming patterns.**** > > ** ** > > There has been a lot of discussion in the web community and ECMA working > groups around the future of the javascript language and the possibility of > moving the event queue into the javascript runtime itself. Those are > interesting discussions however forward looking and outside the prevue of > this deliverable. We would like to leave the larger discussion for the > experts on the ECMA side and focus this discussion around a targeted API > that will solve the immediate problem and fit well into the HTML4/HTML5 > patterns of today.**** > > ** ** > > Here’s the first draft of what a “setImmediate” API may look like. We know > a few people have expressed concerns around the API name. The “set” portion > of the name follows the setTimeout and setInterval naming conventions, and > the “Immediate” portion was intended to communicate the immediate nature of > the callback. This feels like a good initial name which we validated doesn’t > have compatibility implications across the top 1 million sites. We expect to > iterate on the name based on feedback as the design evolves.**** > > ** ** > > We’re looking forward to your thoughts on the first draft.**** > > ** ** > > As an aside, we now have drafts for all three of the new API’s we brought > into the performance working group charter this spring. It’s cool to see > Page Visibility, Request Animation Frame, and Efficient Script Yielding all > starting to come together. Congratulations everyone.**** > > ** ** > > Thanks,**** > > Jatinder and Jason**** > > ** ** > > ** ** >
Received on Friday, 1 July 2011 05:48:06 UTC