crom: faster web browsing using speculave execuon

43
Crom: Faster Web Browsing Using Specula9ve Execu9on James Mickens Jeremy Elson Jon Howell Jacob R. Lorch

Upload: others

Post on 18-Dec-2021

3 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Crom: Faster Web Browsing Using Speculave Execuon

Crom: Faster Web Browsing Using Specula9ve Execu9on 

James Mickens  Jeremy Elson  Jon Howell  Jacob R. Lorch 

Page 2: Crom: Faster Web Browsing Using Speculave Execuon

Surfing the Web 

Page 3: Crom: Faster Web Browsing Using Speculave Execuon

Prefetching: Web 1.0 •  Sta9c objects connected by declara9ve links •  Find prefetchable objects by traversing graph 

<TABLE WIDTH='100%‘>     <TR>         <TD VALIGN='TOP' HEIGHT=60>             <A HREF='/misc/winNews.htm'>                 Windows news             </A>         </TD> 

Page 4: Crom: Faster Web Browsing Using Speculave Execuon

The Brave New World: Web 2.0 

imgTile.ondblclick = func9on(){         map.centerTile = imgTile;         map.zoomLevel++;         map.fetchAndDisplayNeighbors(imgTile, map.zoomLevel); } 

Page 5: Crom: Faster Web Browsing Using Speculave Execuon

New Challenges to Prefetching 

•  Fetches triggered by impera9ve event handlers – Can’t just “pre‐execute” handlers to warm cache 

•  Prefetcher must understand JavaScript – Hide side effects of specula9on un9l commit 9me 

imgTile.ondblclick = func9on(){         map.centerTile = imgTile;         map.zoomLevel++;         map.fetchAndDisplayNeighbors(imgTile,                                                    map.zoomLevel); } 

Page 6: Crom: Faster Web Browsing Using Speculave Execuon

New Challenges to Prefetching •  Fetches oken driven by user‐generated inputs – Binary: clicking a “download” bulon – Unconstrained: typing into a search form 

•  Infeasible to speculate on all possible user inputs! – Only speculate on constrained set of reasonable inputs 

Page 7: Crom: Faster Web Browsing Using Speculave Execuon

Prior Solu9ons: Custom Code •  Advantage: Exploit app‐specific knowledge for . . . – Tight code – High performance 

•  Disadvantages: – Oken difficult to write – Tightly integrated with applica9on code base (can’t be shared with other apps) 

Page 8: Crom: Faster Web Browsing Using Speculave Execuon

Our Solu9on: Crom 

•  A generic specula9on engine for JavaScript –  Implemented as regular JavaScript library 

– Requires no modifica9on to browsers 

•  Applica9ons define their specula0ve intents – Which event handlers should be specula9ve? – At what point should specula9ons occur? – Given an applica9on state, how does Crom generate specula9ve user inputs that are reasonable? 

Page 9: Crom: Faster Web Browsing Using Speculave Execuon

Crom Handles The Rest ™ •  Clones browser state •  Executes rewrilen event handlers 

•  Commits shadow state if appropriate (fetch latency masked!) 

•  Crom provides other goodness: –  AJAX cache –  Specula9ve upload API –  Specula9ve r+w ops on server‐side 

Page 10: Crom: Faster Web Browsing Using Speculave Execuon

Outline 

•  Specula9ve Execu9on – Cloning the browser state – Rewri9ng event handlers – Commisng specula9ve contexts – Op9miza9ons 

•  Evalua9on •  Related Work 

•  Conclusions 

Page 11: Crom: Faster Web Browsing Using Speculave Execuon

Adding Specula9ve Execu9on 

<div id=“textDiv”>         Click here to increment counter! </div> <script>         var globalVar = 42;         var f1 = func9on(){globalVar++;};         var f2 = func9on(){globalVar++; f1();};         var t = document.getElementById(“textDiv”);         t.onclick = f2; </script> 

</script> 

Crom.makeSpecula9ve(t, “onclick”); Crom.speculate(); 

Page 12: Crom: Faster Web Browsing Using Speculave Execuon

Cloning the Browser State 

•  Applica9on heap – All JavaScript objects reachable from the roots of the global namespace 

– Apps access global namespace through global “window” variable (e.g., window.X) 

•  DOM tree –  JavaScript data structure represen9ng page HTML 

– Each HTML tag has corresponding DOM object – App changes page visuals by modifying DOM tree 

Page 13: Crom: Faster Web Browsing Using Speculave Execuon

Cloning the Applica9on Heap 

•  Walk object graph and deep‐copy everything 

•  Objects, primi9ves copied in obvious way . . . 

•  Func9ons – clonedF = eval(f.toString()) – Deep copy any object proper9es 

var specWindow = {};  //Our shadow global namespace for(var globalProp in window) 

specWindow[globalProp] = Crom.deepCopy(window[globalProp]); 

Page 14: Crom: Faster Web Browsing Using Speculave Execuon

Cloning the DOM Tree 

<div>  <div> 

<p>  <p> 

<body> 

Style alributes 

Event handlers 

App proper9es 

Style alributes 

Event handlers 

App proper9es 

<div>  <div> 

<p>  <p> 

<body> 

1) body.cloneNode()     (Na9ve code: FAST) 2) Crom fix‐up traversal     (Non‐na9ve code: SLOW) 

Style alributes 

Style alributes 

App proper9es 

App proper9es 

Event handlers 

Event handlers 

Page 15: Crom: Faster Web Browsing Using Speculave Execuon

Pusng It All Together 

Congratula9ons! 

//Create a new DOM tree var specFrame = document.createElement(“IFRAME”); specFrame.document.body = Crom.cloneDOM(); 

//Create a new global JavaScript namespace var specWindow = {}; for(var globalProp in window)         specWindow[globalProp] = Crom.deepCopy(window[globalProp]); specWindow.window = specWindow; specWindow.document = specFrame.document; 

Page 16: Crom: Faster Web Browsing Using Speculave Execuon

global_scope = {“globalVar”: 42,                              “f1”: func9on(){…},                              “f2”: func9on(){…}} 

•  JavaScript is lexically scoped – Ac9va9on records are objects (varNamevarValue) 

– Resolve refs by following chain of scope objects 

f2_scope = {}; 

var globalVar = 42; 

var f1 = func9on(){globalVar++;} 

var f2 = func9on(){globalVar++; f1();} 

Top‐level code 

Call f2() Get value of globalVar 

Look for globalVar FAIL 

Look for globalVar SUCCEED 

Rewri9ng Event Handlers 

Page 17: Crom: Faster Web Browsing Using Speculave Execuon

Rewri9ng Event Handlers •  “with(obj)” inserts obj to front of scope chain 

global_scope = {“globalVar”: 42,                              “f1”: func9on(){…},                              “f2”: func9on(){…}} 

f2_scope = {}; 

Crom.rewrite = func9on(f, specWindow){ 

   var newSrc = “func9on f(){“ + 

              “with(specWindow){“ + 

                      f.toString() + “}}”;    return eval(newSrc); 

}; 

var globalVar = 42; 

var f1 = func9on(){globalVar++;} 

var f2 = func9on(){globalVar++; f1();} var f2’ = Crom.rewrite(f2); 

Call f2’() Access globalVar 

specWindow = {“globalVar”: 42,                            “f1”: func9on(){…},                            “f2”: func9on(){…}} 

Look for globalVar SUCCEED 

Prevents specula9on from modifying non‐spec global state! 

Page 18: Crom: Faster Web Browsing Using Speculave Execuon

Rewri9ng Event Handlers •  Various details (see the paper) – Lazily rewri9ng inner func9on calls – Addi9on/dele9on of global variables – Rewri9ng closures – Local variables that shadow global ones 

var f2 = func9on(){ 

    globalVar++;  

    f1(); 

}; 

specWindow = Crom.newContext(); 

var f2’ = func9on(){ 

    with(specWindow){ 

        var f1’ = Crom.rewrite(f1, specWindow);         globalVar++; 

        f1’(); 

    } 

}; 

Page 19: Crom: Faster Web Browsing Using Speculave Execuon

Adding Specula9ve Execu9on 

<div id=“textDiv”>         Click here to increment counter! </div> <script>         var globalVar = 42;         var f1 = func9on(){globalVar++;}         var f2 = func9on(){globalVar++; f1();}         var t = document.getElementById(“textDiv”);         t.onclick = f2; 

</script> 

Crom.makeSpecula9ve(t, “onclick”); Crom.speculate(); 

1) Clone browser state 2) Rewrite t.onclick() 

3) Run t.onclick’() 

Page 20: Crom: Faster Web Browsing Using Speculave Execuon

Outline 

•  Specula9ve Execu9on – Cloning the browser state – Rewri9ng event handlers – Commisng specula9ve contexts – Op9miza9ons 

•  Evalua9on •  Related Work 

•  Conclusions 

Page 21: Crom: Faster Web Browsing Using Speculave Execuon

Commisng Specula9ve Contexts •  Suppose you know which one to commit . . . 

•  . . . but how do you know? 

//Commit the specula9ve DOM tree document.body = specWindow.document.body; 

//Commit the applica9on heap by commisng global heap roots for(var propName in specWindow)         window[propName] = specWindow[propName]; 

//Clean‐up globals deleted by commisng specula9on for(var propName in window){          if(!(propName in specWindow))                  delete window[propName]; } 

Page 22: Crom: Faster Web Browsing Using Speculave Execuon

Start‐state Equivalence 

•  When is it safe to commit a specula9ve context? –  Its start state must have been equivalent to applica9on’s current state 

–  The specula9ve input that mutated it must be equivalent to the current (real) input 

•  Applica9on defines equivalence func9on – Hash func9on over global namespace (real or specula9ve) –  Specula9ve context can only commit if its hash matches that of current (real) namespace 

•  Applica9on defines mutator func9on –  Tells Crom how to change a new specula9ve context before running specula9ve event handler 

Page 23: Crom: Faster Web Browsing Using Speculave Execuon

Mutator:  func9on(specNamespace, specInput){                            specNamespace.searchText = specInput;                   } State hash: func9on(globalNamespace){                             return globalNamespace.searchText;                   } Crom.makeSpecula9ve(searchText, “onchange”,                                            mutator, stateHash,                                            [[“housing”], [“tulips”]]); 

Page 24: Crom: Faster Web Browsing Using Speculave Execuon

S“”  S“housing” 

S“tulips” Crom clones 

Crom mutates 

S“housing” 

S“” 

S“” 

S“tulips” Crom speculates, warms cache 

S“”  S“housing” 

User types “housing” 

Crom finds shadow state w/matching hash, commits it 

S“housing” 

Page 25: Crom: Faster Web Browsing Using Speculave Execuon

Start‐state Equivalence 

•  What if app doesn’t specify SSE data? – Crom throws away all specula9ons whenever any event handler executes, respeculates on everything 

•  Guarantees correctness for commits . . . –  . . . but may lead to wasteful respecula9on 

Page 26: Crom: Faster Web Browsing Using Speculave Execuon

Outline 

•  Specula9ve Execu9on – Cloning the browser state – Rewri9ng event handlers – Commisng specula9ve contexts – Op9miza9ons 

•  Evalua9on •  Related Work 

•  Conclusions 

Page 27: Crom: Faster Web Browsing Using Speculave Execuon

•  Don’t need to copy en9re heap forest! – Only clone trees touched by specula9on 

– Lazily clone them at rewrite 9me 

Z Y 

Stale! 

1) Pre‐specula9on 

2) Specula9ve event handler touches Y.Z 

3) Commit 

Page 28: Crom: Faster Web Browsing Using Speculave Execuon

Y:1 X:0 

Z:2  Z:2 

Y:1 

Tracking Parent References 

X:0  Y:1 

Z:2  Y:1 

Z:2 

X:0 

Z:2 

1) Pre‐specula9on 

2) Parent mapping 

3) Specula9on 4) Commit: roots updated Commiled ids: 1,2 Ids of their parents: 0,1 X wasn’t commiled! Warning: stale child ref! 

Y:1 

Z:2 

X:0 

5) Commit: child refs patched 

Page 29: Crom: Faster Web Browsing Using Speculave Execuon

Three Specula9on Modes •  Full copy: clone en0re heap for each specula9on – Always safe – May be slow – Non‐amor9zable costs 

•  Checked lazy mode: lazy copying+parent tracking – Always safe –  Parent mapping costs amor9zable across specula9ons – May be slow 

•  Unchecked lazy mode –  Fast – Oken safe in prac9ce, but strictly speaking . . . –  . . . unsafe without checked mode refactoring 

Page 30: Crom: Faster Web Browsing Using Speculave Execuon

Outline 

•  Specula9ve Execu9on – Cloning the browser state – Rewri9ng event handlers – Commisng specula9ve contexts – Op9miza9ons 

•  Evalua9on •  Related Work 

•  Conclusions 

Page 31: Crom: Faster Web Browsing Using Speculave Execuon

Evalua9on Applica9on 

•  DHTMLGoodies Tab Manager –  Speculate on crea9ng new tab (AJAX www.cnn.com) –  Embed manager code within ESPN front page 

•  Can we hide Crom’s overhead in user think 9me? 

Page 32: Crom: Faster Web Browsing Using Speculave Execuon

Specula9on Costs (Unchecked Lazy Mode) 

25 

50 

75 

100 

Copy DOM

 tree 

Copy EH a

nd UO 

Rewrite m

utator 

Rewrite ha

ndler (lexic

al analysis +

 eval()) 

Rewrite ha

ndler (clon

ing object

s) 

Commit specula9

ve context

 

Execu&

on &me (m

s) 

24 ms        77ms 

Page 33: Crom: Faster Web Browsing Using Speculave Execuon

Specula9on Costs (Checked Lazy Mode) 

Pre‐commit overhead: 182 ms Commit overhead: 5 ms 

Page 34: Crom: Faster Web Browsing Using Speculave Execuon

Specula9on Costs: Autocompletor 

25 

50 

75 

100 

Copy DOM

 tree 

Copy EH a

nd UO 

Rewrite m

utator 

Rewrite ha

ndler (lexic

al analysis +

 eval()) 

Rewrite ha

ndler (clon

ing object

s) 

Commit specula9

ve context

 

Execu&

on &me (m

s) 

114 ms        67ms 

Page 35: Crom: Faster Web Browsing Using Speculave Execuon

Specula9on Costs: Autocompletor 

Pre‐specula9on overhead: 493 ms Commit overhead: 7 ms 

Page 36: Crom: Faster Web Browsing Using Speculave Execuon

0  100  200  300  400  500 

Second

s to Final Rep

aint 

Ar&ficially Induced Fetch Latency (ms) 

No specula9on 

Crom specula9on 

User‐perceived Latency Reduc9on 

399 ms 

3427ms 

Page 37: Crom: Faster Web Browsing Using Speculave Execuon

Copying the Full Heap 

200 

400 

600 

800 Time to Cop

y En

&re App

 Heap (m

s) 

11,037 ms 

Page 38: Crom: Faster Web Browsing Using Speculave Execuon

Copying the Full DOM Tree 

100 

200 

300 

400 

Full DOM Tree Co

py (m

s)  Copying event handlers 

and user‐defined objects 

Copying DOM tree (done by na9ve code) 

Page 39: Crom: Faster Web Browsing Using Speculave Execuon

Building the Parent Map 

100 

200 

300 

400 

Parent m

apping &me (m

s)  Applica9on heap 

DOM tree 

Page 40: Crom: Faster Web Browsing Using Speculave Execuon

Commisng the En9re DOM Tree 

50 

100 

150 

CommiF

ng en&

re DOM tree (m

s) 

Page 41: Crom: Faster Web Browsing Using Speculave Execuon

Outline 

•  Specula9ve Execu9on – Cloning the browser state – Rewri9ng event handlers – Commisng specula9ve contexts – Op9miza9ons 

•  Evalua9on •  Related Work 

•  Conclusions 

Page 42: Crom: Faster Web Browsing Using Speculave Execuon

The Shoulders of Giants 

•  Specula9on is a well‐known op9miza9on –  File systems: Chang et al, Speculator –  Sta9c web data: Fasterfox, HTML 5 prefetch alribute 

•  Crom’s contribu9ons –  Exploit language introspec0on to have apps self‐modify 

–  Explicitly reason about user inputs –  Handle dynamically‐named content 

Page 43: Crom: Faster Web Browsing Using Speculave Execuon

Conclusions •  Prefetching non‐trivial in RIA – Must reason about JavaScript to get fetch targets! 

– Current specula9ve solu9ons use custom code 

•  Crom: generic JS specula9on engine 

– Applica9ons express specula9ve  intents 

– Crom automates low‐level tasks – Can reduce user‐perceived latency by order of magnitude