440 likes | 561 Views
Programarea Clientului Web. s.l. dr. ing. Simona Caraiman mailto : sarustei@cs.tuiasi.ro. Universitatea Tehnica “ Gh. Asachi ” din Iasi Facultatea de Automatica si Calculatoare. Client side performance. Client-side performance.
E N D
Programarea Clientului Web s.l. dr. ing. Simona Caraiman mailto: sarustei@cs.tuiasi.ro Universitatea Tehnica “Gh. Asachi” din Iasi Facultatea de Automatica si Calculatoare
Client side performance C10-Client Side Performance
Client-side performance • majoritatea site-urilorutilizeaza Ajax siscripturi JavaScript complexepentru a creaaplicatii RIA • procesarea client-side dureazamaimulttimpdecatprocesarea server-side (Steve Souders/Google) • numai10-20% din timpul total de raspunsperceput de end-user esteconsumat cu transferuldocumentului HTML in browser C10-Client Side Performance
Performance tips • modul in care estescriscodulaplicatieiweb are o influentadramaticaasupraperformantelor • Google - Web Performance Best Practices • Yahoo - Best Practices for Speeding Up Your Web Site • Steve Souders - 14 Rules for Faster-Loading Web Sites C10-Client Side Performance
Instrumente • de analiza si profiling • browser specific • Firefox - Firebug/PageSpeed, YSlow • Chrome – Speed Tracer • Safari/Chrome – Timeline tab • IE - dynaTrace • Navigation Timing – • W3C Recom. (Dec. 2012) • http://www.w3.org/TR/navigation-timing/ • defines an interface for web applications to access timing information related to navigation and elements. C10-Client Side Performance
Performance best practices Performantad.p.d.v. al clientului web • Page load time = timpulscursintremomentul in care userul face o cererept o nouapaginasimomentul in care paginaesteafisatacomplet de browser C10-Client Side Performance
Performance best practices • Pasiimplicati in page load time: • rezolutianumelor DNS • setareaconexiunilor TCP • transmitereacererilor HTTP • descarcarearesurselor • aducerearesurselor din cache • parsareasiexecutia script-urilor • randareaobiectelor in pagina • Imbunatatireaperformantelor: • eliminareaunorpasi • paralelizarealor • scurtareatimpuluinecesarexecutiei C10-Client Side Performance
Optimizarea incarcarii paginilor • Optimizarea cache-ului • mentinerea datelor si logicii aplicatiei ‘off the network’ • Minimizarea timpilor dus-intors (RTT - round-trip times • reducerea numarului de cicluri seriale cerere-raspuns • Minimizarea intarzierilor asociate cererilor • reducerea dimensiunii upload-ului • Minimizarea dimensiunii incarcarii • reducerea dimensiunilor raspunsurilor, download-urilor si a paginilor stocate in cache • Optimizarea randarii in browser • imbunatatirea layout-ului paginii • Optimizarea pt mobile • ajustarea unui site tinand cont de caracteristicile retelelor si device-urilor mobile C10-Client Side Performance
Optimizarea cache-ului • mentinerea datelor si logicii aplicatiei ‘off the network’ • resurse care se modifica rar: fisiere CSS, imagini, fisiere JS • solutie – HTTP caching (browser/proxy) • Reducerea RTT (eliminarea cererilor HTTP corespunzatoare) • Reducerea substantiala a dimensiunii totale a payload-ului C10-Client Side Performance
Optimizarea cache-ului • Browser caching – resurse statice • setarea headerelor HTTP corespunzatoare (Expires/Cache-Control max-age, Last-Modified/Etag) C10-Client Side Performance
Optimizarea cache-ului • Browser caching – resurse care se modifica ocazional • dynamic caching – fingerprinting • resursa este pastrata in cache-ul browser-ului pana cand se modifica pe server, serverul instiinteaza browser-ul despre disponibilitatea unei noi versiuni • incorporarea in URL (i.e. file path) a unui fingerprint al resursei • schimbarea resursei => schimbarea amprentei => schimbarea URL-ului => browserul este fortat sa acceseze resursa pe server C10-Client Side Performance
Optimizarea cache-ului • Browser caching – resurse care se modifica ocazional • dynamic caching – fingerprinting • resursa este pastrata in cache-ul browser-ului pana cand se modifica pe server, serverul instiinteaza browser-ul despre disponibilitatea unei noi versiuni • incorporarea in URL (i.e. file path) a unui fingerprint al resursei • schimbarea resursei => schimbarea amprentei => schimbarea URL-ului => browserul este fortat sa acceseze resursa pe server Expires– 1 an dupa efectuarea cererii Last-Modified – data la care fisierul a fost modificat Cache-Control: max-age – 31536000 C10-Client Side Performance
Optimizarea cache-ului • Proxy caching – resurse statice • Directiva HTTP Cache-Control public • nu se include un query string in URL-urile resurselor statice • multe proxy-uri nu stocheaza resurse continand “?” in URL • resurse care seteaza cookies • Cache-Control private C10-Client Side Performance
Optimizarea cache-ului • Proxy caching – resurse statice • probleme la stocarea fisierelor CSS si JS • servirea resurselor comprimate catre browsere ce nu pot face dezarhivarea corespunzatoare (bug-uri ale proxy-urilor ce nu detecteaza headerul Content-Encoding) • Solutii: • pt. aplicatii multi-homed (se bazeaza mai putin pe proxy-caching): setarea Cache-Control: private • pt. aplicatii singly-homed: setarea Vary: Accept-Encoding (proxy-ul va stoca 2 versiuni ale resursei, una comprimata si una necomprimata) C10-Client Side Performance
Minimizarea RTT • RTT (Round-trip Time) • timpul necesar pt trimiterea cererii de catre client si timpul necesar serverului sa trimita un raspuns • NU include timpul asociat transferului datelor (nu depinde de bandwidth) • Ex.:initierea unui conexiuni browser-server = 3 RTTs (1 RTT – rezolutia DNS, 1 RTT – setarea conexiunii TCP, 1 RTT – cererea HTTP + primul byte al raspunsului) • 1 RTT = <1ms (LAN) ÷ >1s • factor principal al latentei in cazul conexiunilor rapide/download fisiere de mici dimens. C10-Client Side Performance
Minimizarea RTT • Minimizareainterogarilor DNS • Minimizarearedirectarilor • Evitareacererilorgresite (erori 404/410) • Combinareafisierelor JS externe • Combinareaimaginilorcolosind CSS sprites • Optimizareaordinii de legare a fisierelor de stilsi a scripturilor • Evitareadocument.write • Evitarea CSS @import • Paralelizarea download-urilorfolosinddomenii multiple C10-Client Side Performance
Minimizarea RTT • Minimizareainterogarilor DNS • In teorie: o interogare DNS = 1RTT • In practica: • dacainregistrarea din cache-ulserverului DNS esteexpirataestenecesaratraversareamaimultornoduri din ierarhia DNS • validitateauneiinregistrari DNS este data de valoarea TTL (time-to-live) • in multecazuriestefoarte mica (5min-24h) ptshiftarearapida a traficului in caz de blocaje in retea C10-Client Side Performance
Minimizarea RTT • Minimizarea interogarilor DNS • minimizarea nr. de hostname-uri diferite de unde se face download de resurse • numar optim de hostname-uri: 1-5 (1 host principal + 4 hosturi pt. paralelizarea dowload-ului resurselor) • utilizarea de cai URL in loc de hostname (www.example.com/developer in loc de developer.example.com) • minimizarea interogarilor in ‘critical path’ • deservirea fisierelor JS externe necesare randarii initiale a paginii de pe acelasi domeniu ca si pagina C10-Client Side Performance
Minimizarea RTT • Combinarea fisierelor JS externe • Partitionarea codului JS => aplicatii web modulare, componente reutilizabile DAR, • importarea separata a modulelor in HTML => download-uri secventiale • Partitionarea optimala a fisierelor JS: 2 fisiere • 1 fisier – codul JS minimal necesar randarii paginii la startup • 1 fisier – codul JS care nu este necesar inainte de terminarea incarcarii paginii C10-Client Side Performance
Minimizarea RTT • Combinareafisierelor JS externe • deservirea de cat maiputinefisiere JS din sectiunea<head>, si de dimensiune cat mai mica. • deservireaunui JS asociatuneicomponenterarvizitatedintr-un fisierseparat • fisierulva fi servitdoar at. candcomponentaesteceruta de user • cod JS micce nu tb. pastrat in cache -> inline • pozitionareacorecta a script-urilor in headeruldocumentului (maximizarea download-urilorparalele) C10-Client Side Performance
Minimizarea RTT • Combinareafisierelor JS externe • deservirea de cat maiputinefisiere JS din sectiunea<head>, si de dimensiune cat mai mica. • deservireaunui JS asociatuneicomponenterarvizitatedintr-un fisierseparat (fisierulva fi servitdoar at. candcomponentaesteceruta de user) • code JS micce nu tb. pastrat in cache -> inline • pozitionareacorecta a script-urilor in headeruldocumentului (maximizarea download-urilorparalele) C10-Client Side Performance
Minimizarea RTT • Amanarea incarcarii functiilor JS care nu sunt apelate la startup • majoritatea aplicatiilor script-intensive utilizeaza cod JS in principal pt tratarea evenimentelor utilizator • APAR DUPA INCARCAREA PAGINII (dupa lansarea onload) • se identifica functiile JS neutilizate inainte de onload • pt mai mult de 25 de functii – se muta intr-un fisier JS separat • se insereaza un event listener in head-ul html ce forteaza fisierul extern sa fie incarcat dupa onload C10-Client Side Performance
Minimizarea RTT • Amanarea incarcarii functiilor JS care nu sunt apelate la startup: <script type="text/javascript"> // Add a script element as a child of the body function downloadJSAtOnload() { var element = document.createElement("script"); element.src = "deferredfunctions.js"; document.body.appendChild(element); } // Check for browser support of event handling capability if (window.addEventListener) window.addEventListener("load", downloadJSAtOnload, false); else if (window.attachEvent) window.attachEvent("onload", downloadJSAtOnload); else window.onload = downloadJSAtOnload; </script> C10-Client Side Performance
Minimizarea RTT • Combinarea fisierelor CSS externe • partitionarea codului CSS in 2 fisiere: • 1fisier - codul CSS minimal pt. randarea paginii la startup • 1 fisier – codul CSS necesar dupa incarcarea paginii • deservirea unui CSS asociat unei componente rar vizitate dintr-un fisier separat • fisierul va fi servit doar at. cand componenta este ceruta de user • regulile CSS ce nu tb. pastrate in cache -> inline • evitarea utilizarii CSS @import dintr-un fisier CSS • browser-ul nu poate downloada fisierele in paralel C10-Client Side Performance
Minimizarea RTT • Combinarea imaginilor folosind CSS sprites • combinarea imaginilor incarcate in aceeasi pagina • combinarea imaginilor cu durata mare de caching • combinarea imaginilor mici • combinarea imaginilor cu palete de culoare similare • Spriting service: SpriteMe C10-Client Side Performance
Minimizarea RTT • Combinarea imaginilor folosind CSS sprites • Ex.: 2 imagini 50x50 .megaphone {width:50px; height:50px; background:url(images/sprite.png) 0 0px;} .smile {width:50px; height:50px; background:url(images/sprite.png) 0 -50px;} … <div class="megaphone"></div> <div class="megaphone"></div> C10-Client Side Performance
Minimizarea RTT • Combinarea imaginilor folosind CSS sprites C10-Client Side Performance
Minimizarea RTT • Optimizareaordinii de legare a fisierelor de stilsi a scripturilor • codul JS poatemodificacontinutulsilayoutulpaginii => download-ul, parsareasiexecutiascripturilorblocheazarandareapaginiisi download-ulresurselorreferitedupa script • dacaaltefisieresunt in curs de download in momentulintalniriiuneireferinte la cod JS, acestaestedownloadat in paralel C10-Client Side Performance
Minimizarea RTT <head><link rel="stylesheet" type="text/css" href="stylesheet1.css" /><script type="text/javascript" src="scriptfile1.js" /><script type="text/javascript" src="scriptfile2.js" /><link rel="stylesheet" type="text/css" href="stylesheet2.css" /><link rel="stylesheet" type="text/css" href="stylesheet3.css" /></head> C10-Client Side Performance
Minimizarea RTT <head> <link rel="stylesheet" type="text/css" href="stylesheet1.css" /> <link rel="stylesheet" type="text/css" href="stylesheet2.css" /> <link rel="stylesheet" type="text/css" href="stylesheet3.css" /> <script type="text/javascript" src="scriptfile1.js" /> <script type="text/javascript" src="scriptfile2.js" /> </head> C10-Client Side Performance
Minimizarea RTT • Incarcareaasincrona a resurselor • la parsareaunui tag script browser-ulblocheazarandareacodului HTML pana la terminarea download-ului, parsariisiexecutiei • Solutie: script incarcatasincron • estedownloadatasap • executiaesteamanata cat timp thread-ul UI al browser-uluiesteocupat (cu randareapaginii) • resursele care nu suntnecesare la afisareainitiala a paginii (ex. tracking/analytics) C10-Client Side Performance
Minimizarea RTT • Incarcareaasincrona a resurselor • atributulasync(HTML5) <script> var node = document.createElement('script'); node.type = 'text/javascript'; node.async = true; node.src = 'example.js'; // Now insert the node into the DOM, perhaps using insertBefore() …… </script> C10-Client Side Performance
Minimizarea RTT • Incarcareaasincrona a resurselor • script tag - asyncvsdefer (HTML5) C10-Client Side Performance
Minimizarea RTT • Paralelizarea download-urilorfolosinddomenii multiple • Spec. HTTP/1.1: browsereleartrebuisapermitacelmult 2 conexiuniconcurenteper hostname • Ex.: 4 conexiuni conc./hostname, pagina HTML cu referinte la 100 resurse de pe un acelasidomeniu => • page load time = 25 RTTs (1 RTT ptfiecare 4 resurse) • Servirea resurselor de pe hostname-uri multiple => maimulteconexiuniparalele • Atentie! introducerea de RTT aditionaleptsetareanoilorconexiuni TCP, latentedatorateinterogarilor DNS ptclienti cu cache gol • 2-5 host-uri, pt. maimult de 10 resurse C10-Client Side Performance
Minimizarea RTT • Paralelizarea download-urilorfolosinddomenii multiple • Spec. HTTP/1.1: browsereleartrebuisapermitacelmult 2 conexiuniconcurenteper hostname • Ex.: 4 conexiuni conc./hostname, pagina HTML cu referinte la 100 resurse de pe un acelasidomeniu => • page load time = 25 RTTs (1 RTT ptfiecare 4 resurse) • Servirea resurselor de pe hostname-uri multiple => maimulteconexiuniparalele • Atentie! introducerea de RTT aditionaleptsetareanoilorconexiuni TCP, latentedatorateinterogarilor DNS ptclienti cu cache gol • 2-5 host-uri, pt. maimult de 10 resurse C10-Client Side Performance
Minimizarea overhead-ului cererii • La trimitereauneicereri HTTP clientultrimitetoate cookie-urileasociatedomeniuluisicaii respective • Conexiuni Internet asimetrice (upload-to-download bandwidth ratio 1:4 - 1:20) • Minimizareadimensiuniicererii • 1 pachet (aprox.1500B) • dimensmediecookie < 400B C10-Client Side Performance
Minimizarea overhead-ului cererii • Servirea continutului static de pe un domeniu ‘cookieless’ • continutul static (imagini, JS, CSS) nu necesita cookies • pt. > 5 resurse statice • Ex. Google News/Code serveste continut static de pe www.gstatic.com C10-Client Side Performance
Minimizarea overhead-ului cererii • Servirea continutului static de pe un domeniu ‘cookieless’ • continutul static (imagini, JS, CSS) nu necesita cookies • pt. > 5 resurse statice • Ex. Google News/Code serveste continut static de pe www.gstatic.com C10-Client Side Performance
Minimizarea overhead-ului cererii • Servirea continutului static de pe un domeniu ‘cookieless’ • continutul static (imagini, JS, CSS) nu necesita cookies • pt. > 5 resurse statice • Ex. Google News/Code serveste continut static de pe www.gstatic.com C10-Client Side Performance
Minimizarea incarcarii • Activareacompresiei • Content-Encoding gzip/deflate • doarptresursemaimari de 150-1000 bytes • apare overhead sidatoritacompresiei/decompresiei • eficientizareacompresiei • asiguraticonsistenta in codul HTML si CSS • specificati in aceeasiordine (ex. alfabetica) • perechile CSS key-value • atributeleelementelor HTML • consistent casing and quoting • nu utilizatigzip pt. imaginisaualtefisierebinare • suntdejacomprimate C10-Client Side Performance
Minimizarea incarcarii • Inlaturareacodului CSS nefolosit • randareapaginiiesteblocatapana la terminareadownloadariisiparsariifoii/foilor de stil • motorul CSS al browser-uluievalueazatoateregulile din fisierulcurent pt. a decide care se aplicapaginiicurente • Recomandare: impartireacodului CSS extern in maimultefisierespecificefiecareipagini a unui site web • Compactareacodului JS/CSS/HTML • eliminareaoctetilorinutili (spatii, indentare) • permiteincarcareamairapida a codului • permiteeficientizareacompresiei • Instrumente de compactare: ClosureCompiler, JSMin, YUICompressor, C10-Client Side Performance
Minimizarea incarcarii • Amanareaincarcarii JS • Functii JS care nu suntapelate la startup • Optimizareaimaginilor • taiereaspatiuluiinutil (crop), reducereaadancimiiculorilor, inlaturarecomentarii, salvareintr-un format potrivit (PNG/GIF/JPEG) • instrumente: GIMP • compresiasuplimentara, farapierderi, a imaginilor JPEG si PNG • instrumente: jpegtran, jpegoptim, OptiPNG, PNGOUT C10-Client Side Performance
Minimizarea incarcarii • Scalarea imaginilor • La afisarea unei imagini cu diferite dimensiuni • Ex. imagine 250x250 + thumbnail 10x10 • evitarea descarcarii a doua imagini • servirea unei singure imagini la cea mai mare dimensiune utilizata in pagina + utilizarea HTML + CSS pentru scalare C10-Client Side Performance