Upload
others
View
7
Download
0
Embed Size (px)
Citation preview
STOPIFYWRESTLING CONTROL FROM WEB BROWSERS
‣ Sam Baxter ‣ Rachit Nigam ‣ Arjun Guha ‣ Joe Politz ‣ Shriram Krishnamurthi
2
WEB PROGRAMMING ENVIRONMENTS
2
WEB PROGRAMMING ENVIRONMENTS
2
WEB PROGRAMMING ENVIRONMENTS
JAVASCRIPT
THE BROWSER RUNTIME
function foo() {
let i = 0;
while (true) {
i++;
}
}
foo (); RUN
Run
3
JAVASCRIPT
THE BROWSER RUNTIME
function foo() {
let i = 0;
while (true) {
i++;
}
}
foo (); RUN
Run Stop
3
JAVASCRIPT
THE BROWSER RUNTIME
function foo() {
let i = 0;
while (true) {
i++;
}
}
foo (); RUN
Run Stop
Run
EVENT QUEUE
3
JAVASCRIPT
THE BROWSER RUNTIME
function foo() {
let i = 0;
while (true) {
i++;
}
}
foo (); i = 0
i = 1
i = 2
RUN
Run Stop
Run
EVENT QUEUE
3
JAVASCRIPT
THE BROWSER RUNTIME
function foo() {
let i = 0;
while (true) {
i++;
}
}
foo (); i = 0
i = 1
i = 2
RUN
Run Stop
Stop
Run
EVENT QUEUE
3
JAVASCRIPT
THE BROWSER RUNTIME
function foo() {
let i = 0;
while (true) {
i++;
}
}
foo (); i = 0
i = 1
i = 2
i = 147
RUN
Run Stop
Stop
Stop
Run
EVENT QUEUE
3
LANGUAGES THAT COMPILE TO JAVASCRIPT 4
LANGUAGES THAT COMPILE TO JAVASCRIPT 4
MAYBE OTHER LANGUAGES AVOID THIS PROBLEM…
LANGUAGES THAT COMPILE TO JAVASCRIPT
ALL INHERIT THE LIMITATIONS OF WEB BROWSERS!
4
JavaScript
STOPIFY
5
JavaScript
CONTINUATIONS FOR JAVASCRIPT
SAVING THE STACK AT RUNTIME
Stopfunction odd(n) {
if (n == 0) return false;
else return even(n-1);
}
function even(n) {
if (n == 0) return true;
else return odd(n-1);
}
even(100000)
Run Stop
6
CONTINUATIONS FOR JAVASCRIPT
SAVING THE STACK AT RUNTIME
Stopfunction odd(n) {
if (n == 0) return false;
else return even(n-1);
}
function even(n) {
if (n == 0) return true;
else return odd(n-1);
}
even(100000)
Run Stop
Run
EVENT QUEUE
6
CONTINUATIONS FOR JAVASCRIPT
SAVING THE STACK AT RUNTIME
Stopfunction odd(n) {
if (n == 0) return false;
else return even(n-1);
}
function even(n) {
if (n == 0) return true;
else return odd(n-1);
}
even(100000)
Run
even
even
odd
Stop
Run
EVENT QUEUE
6
CONTINUATIONS FOR JAVASCRIPT
SAVING THE STACK AT RUNTIME
Stopfunction odd(n) {
if (n == 0) return false;
else return even(n-1);
}
function even(n) {
if (n == 0) return true;
else return odd(n-1);
}
even(100000)
Run
even
even
odd
Stop
Run
EVENT QUEUE
6
CONTINUATIONS FOR JAVASCRIPT
SAVING THE STACK AT RUNTIME
Stopfunction odd(n) {
if (n == 0) return false;
else return even(n-1);
}
function even(n) {
if (n == 0) return true;
else return odd(n-1);
}
even(100000)
Run
Runeven
even
odd
Stop
EVENT QUEUE
7
CONTINUATIONS FOR JAVASCRIPT
SAVING THE STACK AT RUNTIME
Stopfunction odd(n) {
if (n == 0) return false;
else return even(n-1);
}
function even(n) {
if (n == 0) return true;
else return odd(n-1);
}
even(100000)
Run
Runeven
even
odd
Stop
Stop
EVENT QUEUE
7
Run
CONTINUATIONS FOR JAVASCRIPT
SAVING THE STACK AT RUNTIME
Stopfunction odd(n) {
if (n == 0) return false;
else return even(n-1);
}
function even(n) {
if (n == 0) return true;
else return odd(n-1);
}
even(100000)
Run
Runeven
even
odd
Stop
Stop
EVENT QUEUE
even
odd
7
Run
CONTINUATIONS FOR JAVASCRIPT
SAVING THE STACK AT RUNTIME
Stopfunction odd(n) {
if (n == 0) return false;
else return even(n-1);
}
function even(n) {
if (n == 0) return true;
else return odd(n-1);
}
even(100000)
Stop
Stop
EVENT QUEUE
Runeven
even
odd
even
odd
8
Run
CONTINUATIONS FOR JAVASCRIPT
SAVING THE STACK AT RUNTIME
Stopfunction odd(n) {
if (n == 0) return false;
else return even(n-1);
}
function even(n) {
if (n == 0) return true;
else return odd(n-1);
}
even(100000)
Stop
Stop
EVENT QUEUE
Runeven
even
odd
even
oddeven
even
odd
even
odd
8
Run
CONTINUATIONS FOR JAVASCRIPT
SAVING THE STACK AT RUNTIME
Stopfunction odd(n) {
if (n == 0) return false;
else return even(n-1);
}
function even(n) {
if (n == 0) return true;
else return odd(n-1);
}
even(100000)
Stop
Stop
EVENT QUEUE
Runeven
even
odd
even
oddeven
even
odd
even
odd
8
Run
CONTINUATIONS FOR JAVASCRIPT
SAVING THE STACK AT RUNTIME
Stopfunction odd(n) {
if (n == 0) return false;
else return even(n-1);
}
function even(n) {
if (n == 0) return true;
else return odd(n-1);
}
even(100000)
Stop
EVENT QUEUE
Runeven
even
odd
even
odd
8
Run
APPLYING STOPIFY TO PYTHON 9
APPLYING STOPIFY TO PYTHON 9
PYTHON
APPLYING STOPIFY TO PYTHON 9
PYTHON
JAVASCRIPTPYJS
APPLYING STOPIFY TO PYTHON 9
PYTHON
JAVASCRIPT
JAVASCRIPT+CC
PYJS
APPLYING STOPIFY TO PYTHON 9
PYTHON
JAVASCRIPT
JAVASCRIPT+CC
STOPIFY
PYJS
APPLYING STOPIFY TO PYTHON 9
PYTHON
JAVASCRIPT
JAVASCRIPT+CC
STOPIFY
STOPPABLE JAVASCRIPT
PYJS
APPLYING STOPIFY TO PYTHON
UNFORTUNATELY, THIS IS SLOW10
0
10
20
30
anag
ramb
binary_ t re
es
deltab
lue fibnb
ody
pysto
ne
rayt ra
ce_sim
ple
richard
s
spect
ral_ norm
Benchmark
Slow
dow
n re
lati
ve t
o P
yJS
UNDERSTANDING THIS SLOWDOWN
JAVASCRIPT CALL GRAPH
11
UNDERSTANDING THIS SLOWDOWN
JAVASCRIPT CALL GRAPH
11
EVEN
ODD
UNDERSTANDING THIS SLOWDOWN
JAVASCRIPT CALL GRAPH
11
STOPIFY
EVEN
ODD
EVEN
ODD
UNDERSTANDING THIS SLOWDOWN
JAVASCRIPT CALL GRAPH
11
STOPIFY
EVEN
ODD
EVEN
ODD
EVEN
ODD
UNDERSTANDING THIS SLOWDOWN
JAVASCRIPT CALL GRAPH
11
STOPIFY
EVEN
ODD
EVEN
ODD
EVEN
ODD
12
JAVASCRIPT QUIRKS
SPOT THE INFINITE LOOP
13
JAVASCRIPT QUIRKS
SPOT THE INFINITE LOOP
13
x + 1;
JAVASCRIPT QUIRKS
SPOT THE INFINITE LOOP
13
x + 1;
const x = { toString: function() { while (true) {}
}};x + 1;
JAVASCRIPT QUIRKS
SPOT THE INFINITE LOOP
13
x + 1;
const x = { toString: function() { while (true) {}
}};x + 1;
‣ Implicit Method Calls
‣ ‘toString’ and ‘valueOf’
‣ Getters and Setters
‣ Dynamic Code Execution (eval)
SUBLANGUAGES OF JAVASCRIPT 14
JavaScript
SUBLANGUAGES OF JAVASCRIPT 14
JavaScript
toString
valueOf
eval‘arguments’ object
SUBLANGUAGES OF JAVASCRIPT
COMPILERS USE RESTRICTED SUB-LANGUAGES
14
JavaScript
toString
valueOf
eval‘arguments’ object
SUBLANGUAGES OF JAVASCRIPT
COMPILERS USE RESTRICTED SUB-LANGUAGES
14
JavaScript
toString
valueOf
eval‘arguments’ object
OCaml
SUBLANGUAGES OF JAVASCRIPT
COMPILERS USE RESTRICTED SUB-LANGUAGES
14
JavaScript
toString
valueOf
eval‘arguments’ object
OCaml
SUBLANGUAGES OF JAVASCRIPT
COMPILERS USE RESTRICTED SUB-LANGUAGES
14
JavaScript
toString
valueOf
eval‘arguments’ object
OCaml
Python
IMPROVING PERFORMANCE WITH SAFE ASSUMPTIONS15BACK TO PYTHON
0
10
20
30b
bina
ry_t
rees
delta
blue fib float
nbod
ypy
stone
richa
rds
scim
ark−
fftsp
ectra
l_no
rmBenchmark
Slow
dow
nImplicit method callsNo implicit method calls
IMPROVING PERFORMANCE WITH SAFE ASSUMPTIONS15BACK TO PYTHON
0
10
20
30b
bina
ry_t
rees
delta
blue fib float
nbod
ypy
stone
richa
rds
scim
ark−
fftsp
ectra
l_no
rmBenchmark
Slow
dow
nImplicit method callsNo implicit method calls
Median Slowdown
1.7x
EVALUATION
OPTIMIZATIONS
16
EVALUATION
OPTIMIZATIONS
16
Pyth
on
C++
OCa
ml
Java
Scala
Cloj
ure
…
LANGUAGE
EVALUATION
OPTIMIZATIONS
16
Pyth
on
C++
OCa
ml
Java
Scala
Cloj
ure
…
LANGUAGE
Chrome
Firefox
Safari
Microsoft Edge
ChromeOS
PLATFORM
EVALUATION
OPTIMIZATIONS
16
Pyth
on
C++
OCa
ml
Java
Scala
Cloj
ure
…
LANGUAGE
Chrome
Firefox
Safari
Microsoft Edge
ChromeOS
PLATFORM
Implicit Functions
‘arguments’
Stack Representation
…IMPLEMENTATION
EVALUATION 17
●
●
● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ●
0.00
0.25
0.50
0.75
1.00
0 50 100 150
Slowdown
% o
f tria
ls
●Chrome (11.6)ChromeBook (10.8)Edge (30.5)Firefox (11.0)Safari (8.4)
C++ (Emscripten)
●
●
●●
● ●
●●
● ● ● ● ● ● ● ● ●
0.00
0.25
0.50
0.75
1.00
0 10 20 30 40 50
Slowdown
% o
f tria
ls
●Chrome (9.1)ChromeBook (11.2)Edge (13.2)Firefox (17.7)Safari (5.4)
Clojure (ClojureScript)
●
●
●
●
● ● ● ● ● ● ● ● ● ● ●
0.00
0.25
0.50
0.75
1.00
0 10 20 30 40
Slowdown
% o
f tria
ls
●Chrome (3.0)ChromeBook (5.0)Edge (7.0)Firefox (3.4)Safari (1.7)
Dart (dart2js)
●
●
●
●● ● ● ● ● ● ● ● ● ● ● ● ●
0.00
0.25
0.50
0.75
1.00
0 20 40 60
Slowdown
% o
f tria
ls
●Chrome (8.1)ChromeBook (6.0)Edge (20.9)Firefox (9.2)Safari (6.3)
Java (JSweet)
●
●
●
●● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ●
0.00
0.25
0.50
0.75
1.00
0 200 400
Slowdown
% o
f tria
ls
●Chrome (20.0)ChromeBook (14.6)Edge (37.2)Firefox (24.8)Safari (13.7)
JavaScript
●●
●
●
●
● ●● ● ● ● ● ● ● ● ● ● ● ●
0.00
0.25
0.50
0.75
1.00
0 20 40
Slowdown
% o
f tria
ls
●Chrome (5.4)ChromeBook (5.7)Edge (7.2)Firefox (8.9)Safari (4.2)
OCaml (BuckleScript)
●
●
●
●
● ● ● ● ● ● ● ●● ● ● ● ● ●
0.00
0.25
0.50
0.75
1.00
0 5 10 15
Slowdown
% o
f tria
ls
●Chrome (1.7)ChromeBook (1.4)Edge (3.8)Firefox (3.4)Safari (2.0)
Python (PyJS)
●
●●
●
●● ●
●● ● ● ● ● ● ● ● ● ●
0.00
0.25
0.50
0.75
1.00
0 40 80 120
Slowdown
% o
f tria
ls
●Chrome (14.6)ChromeBook (20.2)Edge (17.2)Firefox (23.9)Safari (11.8)
Scala (ScalaJS)
● ● ●
●
●
●
●● ●
● ● ● ● ● ● ● ● ● ● ●
0.00
0.25
0.50
0.75
1.00
0 10 20 30 40
Slowdown
% o
f tria
ls●
Chrome (8.8)ChromeBook (9.0)Edge (18.2)Firefox (13.5)Safari (6.5)
Scheme (scheme2js)
EVALUATION 17
●
●
● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ●
0.00
0.25
0.50
0.75
1.00
0 50 100 150
Slowdown
% o
f tria
ls
●Chrome (11.6)ChromeBook (10.8)Edge (30.5)Firefox (11.0)Safari (8.4)
C++ (Emscripten)
●
●
●●
● ●
●●
● ● ● ● ● ● ● ● ●
0.00
0.25
0.50
0.75
1.00
0 10 20 30 40 50
Slowdown
% o
f tria
ls
●Chrome (9.1)ChromeBook (11.2)Edge (13.2)Firefox (17.7)Safari (5.4)
Clojure (ClojureScript)
●
●
●
●
● ● ● ● ● ● ● ● ● ● ●
0.00
0.25
0.50
0.75
1.00
0 10 20 30 40
Slowdown
% o
f tria
ls
●Chrome (3.0)ChromeBook (5.0)Edge (7.0)Firefox (3.4)Safari (1.7)
Dart (dart2js)
●
●
●
●● ● ● ● ● ● ● ● ● ● ● ● ●
0.00
0.25
0.50
0.75
1.00
0 20 40 60
Slowdown
% o
f tria
ls
●Chrome (8.1)ChromeBook (6.0)Edge (20.9)Firefox (9.2)Safari (6.3)
Java (JSweet)
●
●
●
●● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ●
0.00
0.25
0.50
0.75
1.00
0 200 400
Slowdown%
of t
rials
●Chrome (20.0)ChromeBook (14.6)Edge (37.2)Firefox (24.8)Safari (13.7)
JavaScript
●●
●
●
●
● ●● ● ● ● ● ● ● ● ● ● ● ●
0.00
0.25
0.50
0.75
1.00
0 20 40
Slowdown
% o
f tria
ls
●Chrome (5.4)ChromeBook (5.7)Edge (7.2)Firefox (8.9)Safari (4.2)
OCaml (BuckleScript)
●
●
●
●
● ● ● ● ● ● ● ●● ● ● ● ● ●
0.00
0.25
0.50
0.75
1.00
0 5 10 15
Slowdown
% o
f tria
ls
●Chrome (1.7)ChromeBook (1.4)Edge (3.8)Firefox (3.4)Safari (2.0)
Python (PyJS)
●
●●
●
●● ●
●● ● ● ● ● ● ● ● ● ●
0.00
0.25
0.50
0.75
1.00
0 40 80 120
Slowdown
% o
f tria
ls
●Chrome (14.6)ChromeBook (20.2)Edge (17.2)Firefox (23.9)Safari (11.8)
Scala (ScalaJS)
● ● ●
●
●
●
●● ●
● ● ● ● ● ● ● ● ● ● ●
0.00
0.25
0.50
0.75
1.00
0 10 20 30 40
Slowdown
% o
f tria
ls
●Chrome (8.8)ChromeBook (9.0)Edge (18.2)Firefox (13.5)Safari (6.5)
Scheme (scheme2js)
18STOPIFY.ORG
STOPIFYWRESTLING CONTROL FROM WEB BROWSERS
‣ Sam Baxter ‣ Rachit Nigam ‣ Arjun Guha ‣ Joe Politz ‣ Shriram Krishnamurthi
http://www.stopify.org