KEMBAR78
2013 10-02-html5-performance-aarhus | PDF
HtMl5 eXpErTiSeaTyOuRsErViCe	
  
LaUrISvAn @lAuRiSvAn
Sc5OnLiNe @sC5
EnGiNeErInGHtMl5aPpLiCaTiOnS
fOr bEtTeR pErFoRmAnCe
“GiVemEsOmEtHiNgtHaTIcAnUsE”
15YeArSReTrOsPeCtIvEoFMyPeRsOnAlGeAr
1000 tImEstHesPeEdiN15yEaRs
  CPU Display Connection
Network
Speed / bps
CPU /
MFLOPS Pixels
1994 80486 640x480 modem 14,400 3 307,200
1999 AMD Athlon 500 1024x768 ISDN 128,000 180 786,432
2003 AMD Athlon Tbird 1600x1200 cable modem 300,000 373 1,920,000
2010 Intel Core i5 HDMI cable modem 4,000,000 4,256 4,096,000
1000tImEs tHeCpU,20tImEstHeBaNdWiDtHtODrAw
aPiXeL
web	
  pages?	
  
slow	
  web	
  pages!	
  
pre.y	
  	
  good	
  pages	
  
(in	
  desktop)	
  
OreVeN20tImEsfAsTeR?
SoDowEFeEl OuR ApPsrUn1000
tImEs fAsTeR?
3 tImEsfAsTeR?
WegOtuSeDToCrEaTiNgSlUgGiShWeBSeRvIcEs
AttHeSaMetImE,ApPlEdElIvErEd aSlIcKApPExPeRiEnCe
Äą7
2005	
   2007	
   2009	
   2011	
   2013	
  
Web	
  
1G	
  Smartphone	
  
iPhone	
  
PC	
  
UsEreXpErIeNcE	
  
WehAvETrAdEdPeRfOrMaNcEfOrEvErYtHiNgElSe
•  Distributing the data & computation far away
personal computing à web services à mobile & cloud
•  Consuming increasingly rich data
Text à Images à Videos
•  Moving to highly abstracted & interpreted languages
C à Java à JavaScript
WeBSiTeSStIlLGeTBiGgEr
NoV2010-SePt2013StAtS,HtTpArChIvE/StEvESoUdErS
MoBiLeDeViCeS-5yEaRsBaCkiNCpUSpEeD,
10yEaRsBaCkiNCoNnEcTiOnBaNdWiDtH
 
Samsung
Galaxy S4
My Machine
(2003)
My Machine
(2010)
CPU / MFLOPS 1500 373 4,256
Display / Pixels 2073600 1,920,000 4,096,000
Connection Speed / bps 384000* 300,000 4,000,000
*	
  Assuming	
  3G/UMTS	
  safe	
  speed,	
  due	
  to	
  low	
  adopNon	
  of	
  4G	
  networks	
  
2005	
   2007	
   2009	
   2011	
   2013	
  
Web	
  
iPhone	
  
HTML5	
  
HtMl5&WeBApPsTo ChAlLeNgE
NaTiVeApPsiN SlIcKnEsS
Äą11
UsEreXpErIeNcE	
  
UNlizing	
  HW	
  
accelerated	
  graphics,	
  
offline	
  assets,	
  
advanced	
  gestures	
  
and	
  high	
  perf	
  JS	
  
engines	
  
LeT’sTaRgEtfOrMoBiLeApPPeRfOrMaNcE
•  1s app startup time (first page load time)
•  1s for any subsequent view/page (reasonable delay)
•  100ms UI response time (noticeable delay)
•  16ms paints (LCDs will refresh 50-60Hz, the rest is surplus)
HTML5 App
•  1000 DOM elements
•  1Mb of images and 100
network requests on page
load
How about these?
•  1s first page fold
Native App
•  1000 widgets?
•  1Mb of images and 100
network requests on app
startup?
•  1s application install?
WeBeNgInEsaReqUiTe fAsT!
LeT’suSetHesAmEyArDsTiCkwHeNmEaSuRiNg
IfyOuR eMuLaToRrUnS20tImEs
fAsTeR tHaN tHeTaRgEt,wHaTcAn
yOueXpEcT aBoUtPeRfOrMaNcE?
LeT’sEnGiNeErtHeWeB ApPstHe
SaMewAyApPsArEEnGiNeErEd
oNe-sEcOnDPaGeLoAdS
OnESeCoNdBuDgEt
•  Turn on radio 300ms!
•  DNS lookup + 150ms!
•  SSL handshake + 200ms!
•  Process & load HTML & other resources + 200ms!
•  Parse à Layout à Paint = 150ms!
SiMuLaTeSlOwPaGeSpEeDs
•  Developers tend to have ultra-fast computers & networks and forget
the Egde & 3G network
•  Tip: Network Link Conditioner XCode Plugin & ipfw rules
AsImPlEsImUlAtIoNShElLScRiPt
#!/bin/sh!
#!
# simulate_3g.sh - Simulate a sluggish 3G network with delays & packet loss!
# Usage: simulate_3g.sh 8080 8081!
!
# Make sure only root can run our script!
if [[ $EUID -ne 0 ]]; then!
echo "This script must be run as root" 1>&2!
exit 1!
fi!
!
# Simulate http over 3G, 300kbit/s with 5% packet loss and 200ms delays!
# into all ports given as a parameter!
ipfw pipe 1 config delay 200 plr 0.1 bw 300kbit/s!
for var in "$@"!
do!
ipfw add 1 pipe 1 dst-port $var!
done!
CoMbInEaNdCoMpReSsyOuRReSoUrCeS
•  Combine and minify your CSS and JavaScript
•  Combine small icons into a sprite sheet
•  Squeeze the last bits from your images: It is much easier to
remove 100k from your images than your JavaScript code!
•  Tip: You should automate this, e.g. using Grunt
CaChInGtHeAsSeTs
•  CDNs for caching assets close to the user
•  Varnish, Squid, Nginx etc. in front of your app server
•  Having the CDNs and caches working requires good
headers from your app server, too
•  Tip: Let your Apache/Nginx reverse proxy care for your
headers, they usually do it much better than you do
Cache-Control: public, max-age=0

!Etag: "91580-1380653643000“

!Last-Modified: Tue, 01 Oct 2013 18:54:03 GMT!
ShArDfOrSeVeRaLDoMaInS
•  Modern browsers limit to 6 connections per host your non-
scripted resources (e.g. CSS, images) from several hosts
•  Severe problem because HTTP 1.1 requires the resources
to be sent in the order they were requested
•  Note: Remember the browser security rules, particularly
CORS and Same-origin policy
If yOuStIlLgOtTiMetOOpTiMiZePaGeLoAdS
•  Optimize for the first page fold: Critical CSS and JS
embeded
•  Optimize for connection drops & offline: Application Cache
•  Batch your API calls
•  Serve responsive images, prepare for the W3C adaptive
images extension
!<img alt="The Breakfast Combo” src="banner.jpeg”

! !srcset="banner-HD.jpeg 2x,

! !banner-phone.jpeg 100w,

! !banner-phone-HD.jpeg 100w 2x”>!
60fRaMeSScRoLlaNdAnImAtIoN
OlD-ScHoOlOpTiMiZaTiOnSWoN’tHeLpYoU
•  JavaScript is typically not your problem
•  CSS selector lengths typically have only a minor impact
•  Browsers spend ~90% of its computation layouting and
painting
What you want to track is
•  The causes of relayout and repainting
•  What their costs are
•  Tip: Watch out adding/removing classes & hovering
“TyPiCaL PaInTLoOp”
FuncNon	
  
call	
  /	
  Event	
  
Recalculate	
  
Style	
  
Layout	
  
Paint	
  
Composite	
  
Layers	
  
JavaScript	
  Engine	
  (CPU	
  /	
  Virtual	
  Machine)	
  
Render	
  Tree	
  &	
  Layout	
  Engine	
  (CPU)	
  
Paint	
  Engine	
  (CPU)	
  
Compositor	
  (GPU)	
  
AlL CsSOpErAtIoNsaReN’tEqUaL
•  Geometry changing ops: Layout, repaint, compositing
•  width, height etc…
•  Paint-only ops: Repaint & compositing only
•  borders, outlines, box shadow, etc…
•  Composition only (or less): Things that are 100% in GPU
•  CSS3 Transforms, Opacity
OpTiMiZiNgLaYoUtS&PaInTs
•  Avoid DOM reads after geometry changing DOM
operations
•  Avoid a few expensive paint operations (shadows, border
radius, flexbox etc…)
•  Use translateZ(0) hack if you need a HW accelerated
element
•  Use CSS3 transforms for animating, they will not cause
reflows
1/10sEcOnDtOReSpOnD,
OnEsEcOnDtOsHoWThErEsUlTs
TrAdItIoNaLPaGeSDoN’tDo aNyThInGuNtIlyOu TeLl
*click*	
   *click*	
  
Tradi&onal	
  
ImMeDiAtEFeEdBaCkbUySYoU tImE
OvErAlLpErFoRmAnCemAygEtfAsTeR,tOo
*click*	
   *click*	
  
Feedback	
  
PrElOaDiNg&BoOtStRaPpInGToShOwtHeNeXtPaGeFaStEr
YoUMaYHuRt YoUrSeLfBaD!
*click*	
  
+	
  
*click*	
  
Preloading	
  
Bootstrapping	
  
LaZyLoAd -OpTiMiZiNgfOrtHeFiRsTPaGeFoLd
+	
   +	
  
1st	
  fold	
  inlined	
   Rest	
  of	
  the	
  page	
  as	
  
separate	
  resources	
  
+	
  
Lazy	
  Load	
  
PeRfOrMaNcEiSnOExCePtIoN.AtsOmEpOiNtyOuRaRcHiTeCtUrE
wIlL fIgHtaGaInStyOu.
QuAlItYAtTrIbUtEsoFyOuRaPpaRe
sEtbYyOuRArChItEcTuRe.
ReCaP:GeTtInGtOtHepErFoRmAnCetArGeTs
•  Set the performance goals, prepare for tradeoffs
•  Track the goals from the beginning
•  Don’t guess; measure
•  Simulate the target performance as part of your daily work
•  Keep your code simple, don’t trade it for performance
•  Perfect is the enemy of the good
ThAt’sAlL!
AnYQuEsTiOnS?
HtMl5 eXpErTiSeaTyOuRsErViCe	
  
LaUrISvAn
ThAnKyOu!
Software Architect, SC5 Online Ltd
https://github.com/laurisvan
https://twitter.com/laurisvan

2013 10-02-html5-performance-aarhus