SlideShare una empresa de Scribd logo
1 de 126
Progressive downloads
and rendering



Stoyan Stefanov, Yahoo!
HighLoad++, Moscow, 2010
http://slideshare.net/stoyan/
About me
           YSlow 2.0
Why progressive?
Importance of performance

•   Psychology, physiology
•   Effects of waiting
•   “Time is money”
•   Make people happy
Perception
Perception
Perception
Perception
Time is relative
•   Sometimes crawls
•   Sometimes flies
•   “it depends”
Durations
               actual
            expected
            perceived
                rem’d

                 time
It feels slower when…
•   Unpleasant
•   Unknown
•   Boring
•   Too much to keep track
First time experience
•   Unfamiliar = slow
•   Optimize empty cache or
    there will be no full cache
So… go progressive!
But before we begin…
The basics

•   Reducing the # HTTP
•   Gzip
•   Minification
•   Image smushing
•   Expires
•   CDN
The basics

•   Yahoo!’s best practices +
    YSlow
               http://developer.yahoo.com/performance/


•   Google’s too +
    Page Speed
                         http://code.google.com/speed/
Progressive
Progressive enhancement
Progressive downloads
Progressive rendering
Agenda

1. Prevent download blocks:
   scripts, styles, CC, favicon
2. Ways to render sooner:
   flush, data URIs, lazy loading,
   lazy evaluation, preloading,
   animations
Blocking JavaScript
JavaScript blocks



   html
          js
               png

               png
JavaScript blocks

• A no-no!

<script   src="jquery.js"></script>
<script   src="jquery.twitter.js"></script>
<script   src="jquery.cookie.js"></script>
<script   src="myapp.js"></script>
This waterfall looks ridiculous



html
       js
             js

                  js

                        js

                             png

                             png
JavaScript at the bottom



   html
          png

          png

                js
Non-blocking JavaScript
•   deferand async
•   Defer: IE innovation, ok to
    delay, but keep order
•   Async: HTML5, whatever
<script asyncsrc="my.js" onload="doIt()"></script>
<script defer src="my.js" onload="doIt()"></script>
defer and async timeline

                   async


     defer



             DOMContentLoaded   load
Non-blocking JavaScript
•   Asynchronous loading
     html
                  js

            png

            png


varh, js= document.createElement('script');
js.src = 'myscript.js';
h= document.getElementsByTagName('head')[0];
h.appendChild(js);
Non-blocking JavaScript
•   Others:
    - iframe
    - XHR
    - <object>
    -…
CSS and rendering
Worst enemy?



        CSS
CSS blocks rendering
• The worst component type
• Place way at the top
•@media print, etc in the same
external CSS


          http://www.phpied.com/delay-loading-your-print-css/
                      http://www.phpied.com/rendering-styles/
CSS
CSS
CSS block
downloads?

But they do block:
• When followed
  by an inline script
• When in conditional
  comments
Inline CSS
• Google search
• Bing.com: inline + postload
Same domain
• If you split across domains
• and if you don’t use CDN
• Saves a DNS lookup


• e.g. Google and Bing’s CDN
CC block
Normal page
With conditionally commented
CSS file




                              http://www.phpied.com/
              conditional-comments-block-downloads/
What…?! Case #1
<link type="text/css" rel="stylesheet"
href="1.css">
<!--[if IE 6]>
<link type="text/css" rel="stylesheet"
href="ie.css">
<![endif]-->
What…?! Case #2
<!--[if IE 6]>
<body class="ie6">
<![endif]-->
<!--[if !IE]><!-->
<body>
<!--<![endif]-->
Solution for case #1
<!DOCTYPE html>
<!--[if IE 6]><![endif]-->

<html>
    ...
Solution for case #2
<!--[if IE 6]>
<html class="ie6">
<![endif]-->
<!--[if !IE]><!-->
<html>
<!--<![endif]-->
Blocking favicon
Flush
flush() early
 html


                                     
                         png

                    js

                               css



 html



   js
        png
                                     
              css
flush()
html
head
script src=my.js
       type=text/javascript/script
link href=my.css
       type=text/css rel=stylesheet /
/head

?php flush() ?
body
 ....
Chunked encoding
HTTP/1.1 200 OK
Content-Type: text/plain
Transfer-Encoding: chunked

25
This is the data in the first chunk

1C
and this is the second one

0
Chunked encoding

• Progressive rendering
   - Semantic app chunks
   vs.
   - Server-level chunks
Progressive rendering
                        Chunk
                        #1




                        Chunk
                        #2




                        Chunk
                        #3
!doctype html
html
headtitleMy App/title/head
body
div id=header
imgsrc=logo.png /
   ...
/div!-- end of chunk #1 --



 ... The full body of the page ...
!-- end of chunk #2 --




script src=all_20100925.js/script
/body
Progressive + source order
                             1


3
                             2
4
HTTP chunking: not only HTML
HTTP chunking: not only HTML

•   Google Instant
•   /**/ - delimited JSON
    pieces
•   Chunk #1 suggestions
•   Chunk #2 results

                        http://tinyurl.com/chunkview
Data URIs
Fewer HTTP requests

• Inline images:
   in CSS sprites
   with data: URI scheme


                   http://csssprites.com
                   http://spriteme.org
Fewer HTTP requests

• data: URI scheme

$ php -r echo base64_encode(file_get_contents('my.png'));”
iVBORw0KGgoAAAANSUhEUgAAAAQAAAADCAIAAAA7ljmRAAAAGElEQVQIW2P4
DwcMDAxAfBvMAhEQMYgcACEHG8ELxtbPAAAAAElFTkSuQmCC
Fewer HTTP requests

• data: URI scheme

background-image: url(data:image/png;base64,iVBORw0KG...);
Fewer HTTP requests

• data: URI scheme

imgsrc=data:image/png;base64,iVBOR... /
Both

• flushes
• data: URIs
Fewer HTTP requests

• data: URI scheme
• works in IE!...
Fewer HTTP requests

• data: URI scheme
• works in IE8!
Fewer HTTP requests

• data: URI scheme
• MHTML for IE  8
MHTML
• MIME HTML
• Works in IE 6,7
• Indeed it actually absolutely
does work in IE7/Vista too


                    http://phpied.com
                    /the-proper-mhtml-syntax/
MHTML - one part
Content-Location: myimage
Content-Transfer-Encoding: base64

iVBORw0KGgoAAAANSU....U5ErkJggg==
MHTML - multi parts
Content-Type: multipart/related; boundary=MYSEPARATOR

--MYSEPARATOR

[here comes part one]                              The
                                                   double-
--MYSEPARATOR                                      dash of
                                                   doom
[here's part two]

--MYSEPARATOR--
MHTML.css – all together
/*
Content-Type: multipart/related; boundary=MYSEPARATOR

--MYSEPARATOR
Content-Location: myimage
Content-Transfer-Encoding: base64

iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAMAAADXqc3KAAAD....U5ErkJggg==
--MYSEPARATOR
Content-Location: another
Content-Transfer-Encoding: base64

iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAMAAADXqc3KAAAA....U5ErkJggg==
--MYSEPARATOR--
*/
.myclass {
   background-image:url(mhtml:http://example.org/styles.css!myimage);
}
.myotherclass {
   background-image:url(mhtml:http://example.org/styles.css!another);
}
MHTML: inline too
!doctype html
html
head
titleLook Ma' No HTTP requests/title
style type=text/css
/*
Content-Type: multipart/related; boundary=_

--_
Content-Location:locoloco
Content-Transfer-Encoding:base64

iVBOR...CC
--_
Content-Location:polloloco
Content-Transfer-Encoding:base64

iVBOR....gg==
--_--
*/
.image1 {
  background-image: url(data:image/png;base64,iVBOR...CC); /* normal */
  *background-image: url(mhtml:http://...html!locoloco); /* IE  8 */
}
.image2 {
  background-image: url(data:image/png;base64,iVBOR...gg==); /* normal */
  *background-image: url(mhtml:http://...html!polloloco); /* IE  8 */
}
body {
  font: bold 24px Arial;
}
/style
/head
body
h1MHTML + Data:URIs inline in codestyle/code/h1
p class=image1hellobrhello/p                                          http://phpied.com
p class=image2bonjourbrbonjour/p
/body
/html
                                                                              /inline-mhtml-data-uris/
!doctype html
html
head
titleLook Ma' No HTTP requests/title

style type=text/css
  ...
/*
Content-Type: multipart/related; boundary=_

--_
Content-Location:locoloco
Content-Transfer-Encoding:base64

iVBOR...CC
--_
Content-Location:polloloco
Content-Transfer-Encoding:base64

iVBOR....gg==
--_--
*/
.image1 {
  background-image: url(data:image/png;base64,iVBOR...CC); /* normal */
  *background-image: url(mhtml:http://...html!locoloco); /* IE  8 */
}
.image2 {
  background-image: url(data:image/png;base64,iVBOR...gg==); /* normal */
  *background-image: url(mhtml:http://...html!polloloco); /* IE  8 */
}
body {
  font: bold 24px Arial;
}
...
/style

/head
body
h1MHTML + Data:URIs inline in codestyle/code/h1
p class=image1hellobrhello/p
p class=image2bonjourbrbonjour/p
/body
/html
MHTML + data URI
• X-browser
   single request
      web apps
Single request
• WT☠?
• Separation of concerns
• Content-presentation-
behavior
• yes, it’s a tradeoff
MHTML + data URI
• drawback: repeats the same
encoded image
• solutions:
   - browser-specific CSS
   - keep close = better gzip
   - or… an ingenious hack
Single stream MHTML/data URI

• image header + css + data
/9j/4AA0;background-image:url(data:image/jpeg;base64;00,/9j/4AA0

Reality:

IE:

Others:




                                 http://habrahabr.ru/blogs/webdev/90761/
/*
Content-Type: multipart/related; boundary=granitza

--granitza
Content-Type: text/css;

*/
#myid {
/*
--granitza
Content-Location: myimage
Content-Transfer-Encoding: base64
Content-Type: image/jpeg;*/

/9j/4AA0;background-image:url(data:image/jpeg;base64;00,/9j/4AAQSkZJRgA...);
/*
--granitza
Content-Type: text/css;

*/
background-image: url(mhtml:http://localhost/my.css!myimage) !ie;
}
/*
--granitza--
*/
/*
Content-Type: multipart/related; boundary=granitza

--granitza
Content-Type: text/css;

*/
                                                                               ???
#myid {
/*
--granitza
Content-Location: myimage
Content-Transfer-Encoding: base64
Content-Type: image/jpeg;*/

/9j/4AA0;background-image:url(data:image/jpeg;base64;00,/9j/4AAQSkZJRgA...);
/*
--granitza
Content-Type: text/css;

*/
background-image: url(mhtml:http://localhost/my.css!myimage) !ie;
}
/*
--granitza--
*/
/*
Content-Type: multipart/related; boundary=granitza

--granitza
Content-Type: text/css;

*/
#myid {
/*
--granitza
Content-Location: myimage
Content-Transfer-Encoding: base64
Content-Type: image/jpeg;*/

/9j/4AA0;background-image:url(data:image/jpeg;base64;00,/9j/4AAQSkZJRgA...);
/*
--granitza
Content-Type: text/css;

*/
background-image: url(mhtml:http://localhost/my.css!myimage) !ie;
}
/*
--granitza--
*/
/*
Content-Type: multipart/related; boundary=granitza

--granitza
Content-Type: text/css;

*/                                                           1                 ???
#myid {
/*
--granitza
Content-Location: myimage


                                                                                     2
Content-Transfer-Encoding: base64
Content-Type: image/jpeg;*/

/9j/4AA0;background-image:url(data:image/jpeg;base64;00,/9j/4AAQSkZJRgA...);
/*
--granitza
Content-Type: text/css;

*/
background-image: url(mhtml:http://localhost/my.css!myimage) !ie;
                                                                                3
}
/*
--granitza--
*/
Single stream MHTML/data URI

• And for img too!
Single stream img
h2Hello Kitty/h2
!
--granitza
Content-Location: myimage
Content-Transfer-Encoding: base64
Content-Type: image/gif
2 invalid MHTML headers lines followed by data--![if gt IE 7]
img width=16 height=16 src=data:image/gif;base64,

R0lGODl ... FxMKVvDijNQaodOl+N5Pk+pmIX7brGweCg4SCEhEAOw==![endif]

!--[if lt IE 8]
imgsrc=mhtml:http://.../bolknote.html!myimage width=16 height=16
![endif]--

p more page... /p
Single stream img
h2Hello Kitty/h2
!
--granitza
Content-Location: myimage
Content-Transfer-Encoding: base64
Content-Type: image/gif
2 invalid MHTML headers lines followed by data--![if gt IE 7]
img width=16 height=16 src=data:image/gif;base64,

R0lGODl ... FxMKVvDijNQaodOl+N5Pk+pmIX7brGweCg4SCEhEAOw==![endif]

!--[if lt IE 8]
imgsrc=mhtml:http://.../bolknote.html!myimage width=16 height=16
![endif]--

p more page... /p
Lazy loading
Lazy loading aka post-loading

• After-onload
• Some images
• Below the fold (on scroll)
• Hidden content e.g. tabs
Amazon’s lazy bestsellers

• Page’s purpose is ranking
• Details can come later
• via onload XHR
• JS off = no details
• but that’s fine (see bullet #1)
Lazy evaluation
GMail mobile’s lazy JS
!doctype html
htmlbody
...
scriptid=lazy/*
console.log(I can wait);
*//script
...
script
console.log(I'm needed);
window.onload = function () {
var comment = document.getElementById('lazy')
            .innerHTML,
     code = comment.substring(3, comment.length - 3);
eval(code);
};
/script                                     http://googlecode.blogspot.com/2009/09
/body/html                            /gmail-for-mobile-html5-series-reducing.html
Lazy HTML
!doctype html
htmlbody
...
divid=lazy!--
plots of html goes here.../p
--/div
...
script
window.onload= function () {
var el = document.getElementById('lazy'),
      inner = el.innerHTML,
      code = inner.substring(4, inner.length- 3);
el.innerHTML = code;
};
/script
/body/html
                                                    http://phpied.com... (coming-soon)
Lazy HTML test

•500K (200K gzipped) HTML doc
• “Sherlock Holmes”
• comment out 95%
• still one whole chapter left



               http://www.phpied.com/files/lazyhtml/start.html
Lazy HTML test results
Lazy HTML - misc

• Who loads a book?
• Use case: blog comments
• SEO? Content is hidden
• What about display: none?
• The test page was simple-to-
render, no complex layout
Preloads
Preloads

• Anticipate next page
• Problems:
 - does next page anticipate you?
 - parsing and execution time
•link prefetch=http://..
Preload sans execute
varpreload;
if (/*@cc_on!@*/false) { // IE
    preload = function (file) {
new Image().src = file;
    };
} else {
    preload = function (file) {
varobj = document.createElement('object'),
         body = document.body;
obj.width = 0;
obj.height = 0;
obj.data = file;
body.appendChild(obj);
    };
}
Preload, then execute
varloader = function (file, callback) {
varobj = document.createElement('object'),
body = document.body;
obj.width = 0;
obj.height = 0;
obj.data = file;
obj.onload = function () {
varh,js= document.createElement('script');
js.src =file;
js.onload=callback;
h = document.getElementsByTagName('head')[0];
h.appendChild(js);
   };
body.appendChild(obj);
};
Browser search preload
Chrome search

• In-browser search box
• Gives suggestions as you type
• Visual suggestions in IE8+
IE8 Visual
Search Suggestions


...
Item
TextCurrently: Partly Cloudy, 67F/Text
DescriptionHigh: 71F Low: 63F/Description
Urlhttp://weather.yahoo.com/forecast/USCA1024_f.html/Url
Image source=http://l.yimg.com/a/i/us/we/31/30.gif alt=Partly
Cloudy width=31 height=31/
/Item
...
IE8 Visual Search Preload


...
Item
Textany search suggestion/Text
Image
    source=http://path/to/sprite.png
    width=0
    height=0/
/Item
...
IE8 Visual Search Preload
IE8 Visual Search Preload

• didn’t work for CSS and JS
IE8 Visual Search

• preload images, e.g. sprite
• DNS lookups via beacons
Parting words
Do care about

• Progressive,
    non-blocking,
      asynchronous downloads
• Progressive rendering
Thank you!

Stoyan Stefanov
@stoyanstefanov
http://www.phpied.com
Slides: http://slideshare.net/stoyan/

Más contenido relacionado

Destacado

Fa102 a project
Fa102 a projectFa102 a project
Fa102 a projectMWinke1
 
Live and learn in Ireland presentation in Boston
Live and learn in Ireland presentation in BostonLive and learn in Ireland presentation in Boston
Live and learn in Ireland presentation in BostonTom Farrelly @TomFarrelly
 
Highland Springs Plansbook
Highland Springs PlansbookHighland Springs Plansbook
Highland Springs PlansbookBlakely Rockel
 
Mission vishvas-resume template-18
Mission vishvas-resume template-18Mission vishvas-resume template-18
Mission vishvas-resume template-18vishvasyadav45
 
вечер памяти ахыска 9-11-2014
вечер памяти ахыска 9-11-2014вечер памяти ахыска 9-11-2014
вечер памяти ахыска 9-11-2014Vadim Karastelev
 
Опыт ресоциализации осужденных на Дальнем Востоке
Опыт  ресоциализации осужденных на Дальнем ВостокеОпыт  ресоциализации осужденных на Дальнем Востоке
Опыт ресоциализации осужденных на Дальнем ВостокеVadim Karastelev
 
Bab 8 al qur'an surah al insyirah
Bab 8 al qur'an surah al insyirahBab 8 al qur'an surah al insyirah
Bab 8 al qur'an surah al insyirahghozali27
 
01 service retirement assessment cmmaao pmi pmp
01 service retirement assessment cmmaao pmi pmp01 service retirement assessment cmmaao pmi pmp
01 service retirement assessment cmmaao pmi pmpvishvasyadav45
 

Destacado (14)

CII ASCON Industry Survey, Quarter 1, 2015
CII ASCON Industry Survey, Quarter 1, 2015CII ASCON Industry Survey, Quarter 1, 2015
CII ASCON Industry Survey, Quarter 1, 2015
 
Fa102 a project
Fa102 a projectFa102 a project
Fa102 a project
 
Live and learn in Ireland presentation in Boston
Live and learn in Ireland presentation in BostonLive and learn in Ireland presentation in Boston
Live and learn in Ireland presentation in Boston
 
Highland Springs Plansbook
Highland Springs PlansbookHighland Springs Plansbook
Highland Springs Plansbook
 
Mission vishvas-resume template-18
Mission vishvas-resume template-18Mission vishvas-resume template-18
Mission vishvas-resume template-18
 
Multilateral Newsletter, August 2014
Multilateral Newsletter, August 2014Multilateral Newsletter, August 2014
Multilateral Newsletter, August 2014
 
CII Policy Watch [on] Manufacturing Sector
CII Policy Watch [on] Manufacturing SectorCII Policy Watch [on] Manufacturing Sector
CII Policy Watch [on] Manufacturing Sector
 
вечер памяти ахыска 9-11-2014
вечер памяти ахыска 9-11-2014вечер памяти ахыска 9-11-2014
вечер памяти ахыска 9-11-2014
 
Опыт ресоциализации осужденных на Дальнем Востоке
Опыт  ресоциализации осужденных на Дальнем ВостокеОпыт  ресоциализации осужденных на Дальнем Востоке
Опыт ресоциализации осужденных на Дальнем Востоке
 
Bab 8 al qur'an surah al insyirah
Bab 8 al qur'an surah al insyirahBab 8 al qur'an surah al insyirah
Bab 8 al qur'an surah al insyirah
 
Question 1
Question 1Question 1
Question 1
 
01 service retirement assessment cmmaao pmi pmp
01 service retirement assessment cmmaao pmi pmp01 service retirement assessment cmmaao pmi pmp
01 service retirement assessment cmmaao pmi pmp
 
Interest Rate
Interest RateInterest Rate
Interest Rate
 
Developing a social pact
Developing a social pactDeveloping a social pact
Developing a social pact
 

Similar a Progressive downloads and rendering (Stoyan Stefanov)

Progressive Downloads and Rendering - take #2
Progressive Downloads and Rendering - take #2Progressive Downloads and Rendering - take #2
Progressive Downloads and Rendering - take #2Stoyan Stefanov
 
Build Better Responsive websites. Hrvoje Jurišić
Build Better Responsive websites. Hrvoje JurišićBuild Better Responsive websites. Hrvoje Jurišić
Build Better Responsive websites. Hrvoje JurišićMeetMagentoNY2014
 
JavaScript Performance Patterns
JavaScript Performance PatternsJavaScript Performance Patterns
JavaScript Performance PatternsStoyan Stefanov
 
CSS and image optimization
CSS and image optimizationCSS and image optimization
CSS and image optimizationStoyan Stefanov
 
JavaScript performance patterns
JavaScript performance patternsJavaScript performance patterns
JavaScript performance patternsStoyan Stefanov
 
Going on an HTTP Diet: Front-End Web Performance
Going on an HTTP Diet: Front-End Web PerformanceGoing on an HTTP Diet: Front-End Web Performance
Going on an HTTP Diet: Front-End Web PerformanceAdam Norwood
 
Website Performance Basics
Website Performance BasicsWebsite Performance Basics
Website Performance Basicsgeku
 
Resource Registries: Plone Conference 2014
Resource Registries: Plone Conference 2014Resource Registries: Plone Conference 2014
Resource Registries: Plone Conference 2014Rob Gietema
 
Don't make me wait! or Building High-Performance Web Applications
Don't make me wait! or Building High-Performance Web ApplicationsDon't make me wait! or Building High-Performance Web Applications
Don't make me wait! or Building High-Performance Web ApplicationsStoyan Stefanov
 
Developing High Performance Web Apps - CodeMash 2011
Developing High Performance Web Apps - CodeMash 2011Developing High Performance Web Apps - CodeMash 2011
Developing High Performance Web Apps - CodeMash 2011Timothy Fisher
 
More Than You Ever Wanted to Know About Resource Hints - Harry Roberts (CSS W...
More Than You Ever Wanted to Know About Resource Hints - Harry Roberts (CSS W...More Than You Ever Wanted to Know About Resource Hints - Harry Roberts (CSS W...
More Than You Ever Wanted to Know About Resource Hints - Harry Roberts (CSS W...Shift Conference
 
The Need for Speed - SMX Sydney 2013
The Need for Speed - SMX Sydney 2013The Need for Speed - SMX Sydney 2013
The Need for Speed - SMX Sydney 2013Bastian Grimm
 
HTML5, just another presentation :)
HTML5, just another presentation :)HTML5, just another presentation :)
HTML5, just another presentation :)François Massart
 
10 Tips to make your Website lightning-fast - SMX Stockholm 2012
10 Tips to make your Website lightning-fast - SMX Stockholm 201210 Tips to make your Website lightning-fast - SMX Stockholm 2012
10 Tips to make your Website lightning-fast - SMX Stockholm 2012Bastian Grimm
 
Resource registries plone conf 2014
Resource registries plone conf 2014Resource registries plone conf 2014
Resource registries plone conf 2014Ramon Navarro
 
High performance website
High performance websiteHigh performance website
High performance websiteChamnap Chhorn
 

Similar a Progressive downloads and rendering (Stoyan Stefanov) (20)

Progressive Downloads and Rendering - take #2
Progressive Downloads and Rendering - take #2Progressive Downloads and Rendering - take #2
Progressive Downloads and Rendering - take #2
 
Build Better Responsive websites. Hrvoje Jurišić
Build Better Responsive websites. Hrvoje JurišićBuild Better Responsive websites. Hrvoje Jurišić
Build Better Responsive websites. Hrvoje Jurišić
 
JavaScript Performance Patterns
JavaScript Performance PatternsJavaScript Performance Patterns
JavaScript Performance Patterns
 
CSS and image optimization
CSS and image optimizationCSS and image optimization
CSS and image optimization
 
JavaScript performance patterns
JavaScript performance patternsJavaScript performance patterns
JavaScript performance patterns
 
Going on an HTTP Diet: Front-End Web Performance
Going on an HTTP Diet: Front-End Web PerformanceGoing on an HTTP Diet: Front-End Web Performance
Going on an HTTP Diet: Front-End Web Performance
 
Performance patterns
Performance patternsPerformance patterns
Performance patterns
 
Presentation Tier optimizations
Presentation Tier optimizationsPresentation Tier optimizations
Presentation Tier optimizations
 
Website Performance Basics
Website Performance BasicsWebsite Performance Basics
Website Performance Basics
 
Please dont touch-3.6-jsday
Please dont touch-3.6-jsdayPlease dont touch-3.6-jsday
Please dont touch-3.6-jsday
 
Resource Registries: Plone Conference 2014
Resource Registries: Plone Conference 2014Resource Registries: Plone Conference 2014
Resource Registries: Plone Conference 2014
 
Don't make me wait! or Building High-Performance Web Applications
Don't make me wait! or Building High-Performance Web ApplicationsDon't make me wait! or Building High-Performance Web Applications
Don't make me wait! or Building High-Performance Web Applications
 
Developing High Performance Web Apps - CodeMash 2011
Developing High Performance Web Apps - CodeMash 2011Developing High Performance Web Apps - CodeMash 2011
Developing High Performance Web Apps - CodeMash 2011
 
More Than You Ever Wanted to Know About Resource Hints - Harry Roberts (CSS W...
More Than You Ever Wanted to Know About Resource Hints - Harry Roberts (CSS W...More Than You Ever Wanted to Know About Resource Hints - Harry Roberts (CSS W...
More Than You Ever Wanted to Know About Resource Hints - Harry Roberts (CSS W...
 
The Need for Speed - SMX Sydney 2013
The Need for Speed - SMX Sydney 2013The Need for Speed - SMX Sydney 2013
The Need for Speed - SMX Sydney 2013
 
HTML5, just another presentation :)
HTML5, just another presentation :)HTML5, just another presentation :)
HTML5, just another presentation :)
 
10 Tips to make your Website lightning-fast - SMX Stockholm 2012
10 Tips to make your Website lightning-fast - SMX Stockholm 201210 Tips to make your Website lightning-fast - SMX Stockholm 2012
10 Tips to make your Website lightning-fast - SMX Stockholm 2012
 
performance.ppt
performance.pptperformance.ppt
performance.ppt
 
Resource registries plone conf 2014
Resource registries plone conf 2014Resource registries plone conf 2014
Resource registries plone conf 2014
 
High performance website
High performance websiteHigh performance website
High performance website
 

Más de Ontico

One-cloud — система управления дата-центром в Одноклассниках / Олег Анастасье...
One-cloud — система управления дата-центром в Одноклассниках / Олег Анастасье...One-cloud — система управления дата-центром в Одноклассниках / Олег Анастасье...
One-cloud — система управления дата-центром в Одноклассниках / Олег Анастасье...Ontico
 
Масштабируя DNS / Артем Гавриченков (Qrator Labs)
Масштабируя DNS / Артем Гавриченков (Qrator Labs)Масштабируя DNS / Артем Гавриченков (Qrator Labs)
Масштабируя DNS / Артем Гавриченков (Qrator Labs)Ontico
 
Создание BigData-платформы для ФГУП Почта России / Андрей Бащенко (Luxoft)
Создание BigData-платформы для ФГУП Почта России / Андрей Бащенко (Luxoft)Создание BigData-платформы для ФГУП Почта России / Андрей Бащенко (Luxoft)
Создание BigData-платформы для ФГУП Почта России / Андрей Бащенко (Luxoft)Ontico
 
Готовим тестовое окружение, или сколько тестовых инстансов вам нужно / Алекса...
Готовим тестовое окружение, или сколько тестовых инстансов вам нужно / Алекса...Готовим тестовое окружение, или сколько тестовых инстансов вам нужно / Алекса...
Готовим тестовое окружение, или сколько тестовых инстансов вам нужно / Алекса...Ontico
 
Новые технологии репликации данных в PostgreSQL / Александр Алексеев (Postgre...
Новые технологии репликации данных в PostgreSQL / Александр Алексеев (Postgre...Новые технологии репликации данных в PostgreSQL / Александр Алексеев (Postgre...
Новые технологии репликации данных в PostgreSQL / Александр Алексеев (Postgre...Ontico
 
PostgreSQL Configuration for Humans / Alvaro Hernandez (OnGres)
PostgreSQL Configuration for Humans / Alvaro Hernandez (OnGres)PostgreSQL Configuration for Humans / Alvaro Hernandez (OnGres)
PostgreSQL Configuration for Humans / Alvaro Hernandez (OnGres)Ontico
 
Inexpensive Datamasking for MySQL with ProxySQL — Data Anonymization for Deve...
Inexpensive Datamasking for MySQL with ProxySQL — Data Anonymization for Deve...Inexpensive Datamasking for MySQL with ProxySQL — Data Anonymization for Deve...
Inexpensive Datamasking for MySQL with ProxySQL — Data Anonymization for Deve...Ontico
 
Опыт разработки модуля межсетевого экранирования для MySQL / Олег Брославский...
Опыт разработки модуля межсетевого экранирования для MySQL / Олег Брославский...Опыт разработки модуля межсетевого экранирования для MySQL / Олег Брославский...
Опыт разработки модуля межсетевого экранирования для MySQL / Олег Брославский...Ontico
 
ProxySQL Use Case Scenarios / Alkin Tezuysal (Percona)
ProxySQL Use Case Scenarios / Alkin Tezuysal (Percona)ProxySQL Use Case Scenarios / Alkin Tezuysal (Percona)
ProxySQL Use Case Scenarios / Alkin Tezuysal (Percona)Ontico
 
MySQL Replication — Advanced Features / Петр Зайцев (Percona)
MySQL Replication — Advanced Features / Петр Зайцев (Percona)MySQL Replication — Advanced Features / Петр Зайцев (Percona)
MySQL Replication — Advanced Features / Петр Зайцев (Percona)Ontico
 
Внутренний open-source. Как разрабатывать мобильное приложение большим количе...
Внутренний open-source. Как разрабатывать мобильное приложение большим количе...Внутренний open-source. Как разрабатывать мобильное приложение большим количе...
Внутренний open-source. Как разрабатывать мобильное приложение большим количе...Ontico
 
Подробно о том, как Causal Consistency реализовано в MongoDB / Михаил Тюленев...
Подробно о том, как Causal Consistency реализовано в MongoDB / Михаил Тюленев...Подробно о том, как Causal Consistency реализовано в MongoDB / Михаил Тюленев...
Подробно о том, как Causal Consistency реализовано в MongoDB / Михаил Тюленев...Ontico
 
Балансировка на скорости проводов. Без ASIC, без ограничений. Решения NFWare ...
Балансировка на скорости проводов. Без ASIC, без ограничений. Решения NFWare ...Балансировка на скорости проводов. Без ASIC, без ограничений. Решения NFWare ...
Балансировка на скорости проводов. Без ASIC, без ограничений. Решения NFWare ...Ontico
 
Перехват трафика — мифы и реальность / Евгений Усков (Qrator Labs)
Перехват трафика — мифы и реальность / Евгений Усков (Qrator Labs)Перехват трафика — мифы и реальность / Евгений Усков (Qrator Labs)
Перехват трафика — мифы и реальность / Евгений Усков (Qrator Labs)Ontico
 
И тогда наверняка вдруг запляшут облака! / Алексей Сушков (ПЕТЕР-СЕРВИС)
И тогда наверняка вдруг запляшут облака! / Алексей Сушков (ПЕТЕР-СЕРВИС)И тогда наверняка вдруг запляшут облака! / Алексей Сушков (ПЕТЕР-СЕРВИС)
И тогда наверняка вдруг запляшут облака! / Алексей Сушков (ПЕТЕР-СЕРВИС)Ontico
 
Как мы заставили Druid работать в Одноклассниках / Юрий Невиницин (OK.RU)
Как мы заставили Druid работать в Одноклассниках / Юрий Невиницин (OK.RU)Как мы заставили Druid работать в Одноклассниках / Юрий Невиницин (OK.RU)
Как мы заставили Druid работать в Одноклассниках / Юрий Невиницин (OK.RU)Ontico
 
Разгоняем ASP.NET Core / Илья Вербицкий (WebStoating s.r.o.)
Разгоняем ASP.NET Core / Илья Вербицкий (WebStoating s.r.o.)Разгоняем ASP.NET Core / Илья Вербицкий (WebStoating s.r.o.)
Разгоняем ASP.NET Core / Илья Вербицкий (WebStoating s.r.o.)Ontico
 
100500 способов кэширования в Oracle Database или как достичь максимальной ск...
100500 способов кэширования в Oracle Database или как достичь максимальной ск...100500 способов кэширования в Oracle Database или как достичь максимальной ск...
100500 способов кэширования в Oracle Database или как достичь максимальной ск...Ontico
 
Apache Ignite Persistence: зачем Persistence для In-Memory, и как он работает...
Apache Ignite Persistence: зачем Persistence для In-Memory, и как он работает...Apache Ignite Persistence: зачем Persistence для In-Memory, и как он работает...
Apache Ignite Persistence: зачем Persistence для In-Memory, и как он работает...Ontico
 
Механизмы мониторинга баз данных: взгляд изнутри / Дмитрий Еманов (Firebird P...
Механизмы мониторинга баз данных: взгляд изнутри / Дмитрий Еманов (Firebird P...Механизмы мониторинга баз данных: взгляд изнутри / Дмитрий Еманов (Firebird P...
Механизмы мониторинга баз данных: взгляд изнутри / Дмитрий Еманов (Firebird P...Ontico
 

Más de Ontico (20)

One-cloud — система управления дата-центром в Одноклассниках / Олег Анастасье...
One-cloud — система управления дата-центром в Одноклассниках / Олег Анастасье...One-cloud — система управления дата-центром в Одноклассниках / Олег Анастасье...
One-cloud — система управления дата-центром в Одноклассниках / Олег Анастасье...
 
Масштабируя DNS / Артем Гавриченков (Qrator Labs)
Масштабируя DNS / Артем Гавриченков (Qrator Labs)Масштабируя DNS / Артем Гавриченков (Qrator Labs)
Масштабируя DNS / Артем Гавриченков (Qrator Labs)
 
Создание BigData-платформы для ФГУП Почта России / Андрей Бащенко (Luxoft)
Создание BigData-платформы для ФГУП Почта России / Андрей Бащенко (Luxoft)Создание BigData-платформы для ФГУП Почта России / Андрей Бащенко (Luxoft)
Создание BigData-платформы для ФГУП Почта России / Андрей Бащенко (Luxoft)
 
Готовим тестовое окружение, или сколько тестовых инстансов вам нужно / Алекса...
Готовим тестовое окружение, или сколько тестовых инстансов вам нужно / Алекса...Готовим тестовое окружение, или сколько тестовых инстансов вам нужно / Алекса...
Готовим тестовое окружение, или сколько тестовых инстансов вам нужно / Алекса...
 
Новые технологии репликации данных в PostgreSQL / Александр Алексеев (Postgre...
Новые технологии репликации данных в PostgreSQL / Александр Алексеев (Postgre...Новые технологии репликации данных в PostgreSQL / Александр Алексеев (Postgre...
Новые технологии репликации данных в PostgreSQL / Александр Алексеев (Postgre...
 
PostgreSQL Configuration for Humans / Alvaro Hernandez (OnGres)
PostgreSQL Configuration for Humans / Alvaro Hernandez (OnGres)PostgreSQL Configuration for Humans / Alvaro Hernandez (OnGres)
PostgreSQL Configuration for Humans / Alvaro Hernandez (OnGres)
 
Inexpensive Datamasking for MySQL with ProxySQL — Data Anonymization for Deve...
Inexpensive Datamasking for MySQL with ProxySQL — Data Anonymization for Deve...Inexpensive Datamasking for MySQL with ProxySQL — Data Anonymization for Deve...
Inexpensive Datamasking for MySQL with ProxySQL — Data Anonymization for Deve...
 
Опыт разработки модуля межсетевого экранирования для MySQL / Олег Брославский...
Опыт разработки модуля межсетевого экранирования для MySQL / Олег Брославский...Опыт разработки модуля межсетевого экранирования для MySQL / Олег Брославский...
Опыт разработки модуля межсетевого экранирования для MySQL / Олег Брославский...
 
ProxySQL Use Case Scenarios / Alkin Tezuysal (Percona)
ProxySQL Use Case Scenarios / Alkin Tezuysal (Percona)ProxySQL Use Case Scenarios / Alkin Tezuysal (Percona)
ProxySQL Use Case Scenarios / Alkin Tezuysal (Percona)
 
MySQL Replication — Advanced Features / Петр Зайцев (Percona)
MySQL Replication — Advanced Features / Петр Зайцев (Percona)MySQL Replication — Advanced Features / Петр Зайцев (Percona)
MySQL Replication — Advanced Features / Петр Зайцев (Percona)
 
Внутренний open-source. Как разрабатывать мобильное приложение большим количе...
Внутренний open-source. Как разрабатывать мобильное приложение большим количе...Внутренний open-source. Как разрабатывать мобильное приложение большим количе...
Внутренний open-source. Как разрабатывать мобильное приложение большим количе...
 
Подробно о том, как Causal Consistency реализовано в MongoDB / Михаил Тюленев...
Подробно о том, как Causal Consistency реализовано в MongoDB / Михаил Тюленев...Подробно о том, как Causal Consistency реализовано в MongoDB / Михаил Тюленев...
Подробно о том, как Causal Consistency реализовано в MongoDB / Михаил Тюленев...
 
Балансировка на скорости проводов. Без ASIC, без ограничений. Решения NFWare ...
Балансировка на скорости проводов. Без ASIC, без ограничений. Решения NFWare ...Балансировка на скорости проводов. Без ASIC, без ограничений. Решения NFWare ...
Балансировка на скорости проводов. Без ASIC, без ограничений. Решения NFWare ...
 
Перехват трафика — мифы и реальность / Евгений Усков (Qrator Labs)
Перехват трафика — мифы и реальность / Евгений Усков (Qrator Labs)Перехват трафика — мифы и реальность / Евгений Усков (Qrator Labs)
Перехват трафика — мифы и реальность / Евгений Усков (Qrator Labs)
 
И тогда наверняка вдруг запляшут облака! / Алексей Сушков (ПЕТЕР-СЕРВИС)
И тогда наверняка вдруг запляшут облака! / Алексей Сушков (ПЕТЕР-СЕРВИС)И тогда наверняка вдруг запляшут облака! / Алексей Сушков (ПЕТЕР-СЕРВИС)
И тогда наверняка вдруг запляшут облака! / Алексей Сушков (ПЕТЕР-СЕРВИС)
 
Как мы заставили Druid работать в Одноклассниках / Юрий Невиницин (OK.RU)
Как мы заставили Druid работать в Одноклассниках / Юрий Невиницин (OK.RU)Как мы заставили Druid работать в Одноклассниках / Юрий Невиницин (OK.RU)
Как мы заставили Druid работать в Одноклассниках / Юрий Невиницин (OK.RU)
 
Разгоняем ASP.NET Core / Илья Вербицкий (WebStoating s.r.o.)
Разгоняем ASP.NET Core / Илья Вербицкий (WebStoating s.r.o.)Разгоняем ASP.NET Core / Илья Вербицкий (WebStoating s.r.o.)
Разгоняем ASP.NET Core / Илья Вербицкий (WebStoating s.r.o.)
 
100500 способов кэширования в Oracle Database или как достичь максимальной ск...
100500 способов кэширования в Oracle Database или как достичь максимальной ск...100500 способов кэширования в Oracle Database или как достичь максимальной ск...
100500 способов кэширования в Oracle Database или как достичь максимальной ск...
 
Apache Ignite Persistence: зачем Persistence для In-Memory, и как он работает...
Apache Ignite Persistence: зачем Persistence для In-Memory, и как он работает...Apache Ignite Persistence: зачем Persistence для In-Memory, и как он работает...
Apache Ignite Persistence: зачем Persistence для In-Memory, и как он работает...
 
Механизмы мониторинга баз данных: взгляд изнутри / Дмитрий Еманов (Firebird P...
Механизмы мониторинга баз данных: взгляд изнутри / Дмитрий Еманов (Firebird P...Механизмы мониторинга баз данных: взгляд изнутри / Дмитрий Еманов (Firebird P...
Механизмы мониторинга баз данных: взгляд изнутри / Дмитрий Еманов (Firebird P...
 

Último

My Hashitalk Indonesia April 2024 Presentation
My Hashitalk Indonesia April 2024 PresentationMy Hashitalk Indonesia April 2024 Presentation
My Hashitalk Indonesia April 2024 PresentationRidwan Fadjar
 
[2024]Digital Global Overview Report 2024 Meltwater.pdf
[2024]Digital Global Overview Report 2024 Meltwater.pdf[2024]Digital Global Overview Report 2024 Meltwater.pdf
[2024]Digital Global Overview Report 2024 Meltwater.pdfhans926745
 
The Codex of Business Writing Software for Real-World Solutions 2.pptx
The Codex of Business Writing Software for Real-World Solutions 2.pptxThe Codex of Business Writing Software for Real-World Solutions 2.pptx
The Codex of Business Writing Software for Real-World Solutions 2.pptxMalak Abu Hammad
 
Neo4j - How KGs are shaping the future of Generative AI at AWS Summit London ...
Neo4j - How KGs are shaping the future of Generative AI at AWS Summit London ...Neo4j - How KGs are shaping the future of Generative AI at AWS Summit London ...
Neo4j - How KGs are shaping the future of Generative AI at AWS Summit London ...Neo4j
 
Breaking the Kubernetes Kill Chain: Host Path Mount
Breaking the Kubernetes Kill Chain: Host Path MountBreaking the Kubernetes Kill Chain: Host Path Mount
Breaking the Kubernetes Kill Chain: Host Path MountPuma Security, LLC
 
04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
04-2024-HHUG-Sales-and-Marketing-Alignment.pptx04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
04-2024-HHUG-Sales-and-Marketing-Alignment.pptxHampshireHUG
 
How to convert PDF to text with Nanonets
How to convert PDF to text with NanonetsHow to convert PDF to text with Nanonets
How to convert PDF to text with Nanonetsnaman860154
 
Install Stable Diffusion in windows machine
Install Stable Diffusion in windows machineInstall Stable Diffusion in windows machine
Install Stable Diffusion in windows machinePadma Pradeep
 
Integration and Automation in Practice: CI/CD in Mule Integration and Automat...
Integration and Automation in Practice: CI/CD in Mule Integration and Automat...Integration and Automation in Practice: CI/CD in Mule Integration and Automat...
Integration and Automation in Practice: CI/CD in Mule Integration and Automat...Patryk Bandurski
 
IAC 2024 - IA Fast Track to Search Focused AI Solutions
IAC 2024 - IA Fast Track to Search Focused AI SolutionsIAC 2024 - IA Fast Track to Search Focused AI Solutions
IAC 2024 - IA Fast Track to Search Focused AI SolutionsEnterprise Knowledge
 
Scaling API-first – The story of a global engineering organization
Scaling API-first – The story of a global engineering organizationScaling API-first – The story of a global engineering organization
Scaling API-first – The story of a global engineering organizationRadu Cotescu
 
AI as an Interface for Commercial Buildings
AI as an Interface for Commercial BuildingsAI as an Interface for Commercial Buildings
AI as an Interface for Commercial BuildingsMemoori
 
The 7 Things I Know About Cyber Security After 25 Years | April 2024
The 7 Things I Know About Cyber Security After 25 Years | April 2024The 7 Things I Know About Cyber Security After 25 Years | April 2024
The 7 Things I Know About Cyber Security After 25 Years | April 2024Rafal Los
 
FULL ENJOY 🔝 8264348440 🔝 Call Girls in Diplomatic Enclave | Delhi
FULL ENJOY 🔝 8264348440 🔝 Call Girls in Diplomatic Enclave | DelhiFULL ENJOY 🔝 8264348440 🔝 Call Girls in Diplomatic Enclave | Delhi
FULL ENJOY 🔝 8264348440 🔝 Call Girls in Diplomatic Enclave | Delhisoniya singh
 
08448380779 Call Girls In Diplomatic Enclave Women Seeking Men
08448380779 Call Girls In Diplomatic Enclave Women Seeking Men08448380779 Call Girls In Diplomatic Enclave Women Seeking Men
08448380779 Call Girls In Diplomatic Enclave Women Seeking MenDelhi Call girls
 
Tech-Forward - Achieving Business Readiness For Copilot in Microsoft 365
Tech-Forward - Achieving Business Readiness For Copilot in Microsoft 365Tech-Forward - Achieving Business Readiness For Copilot in Microsoft 365
Tech-Forward - Achieving Business Readiness For Copilot in Microsoft 3652toLead Limited
 
Maximizing Board Effectiveness 2024 Webinar.pptx
Maximizing Board Effectiveness 2024 Webinar.pptxMaximizing Board Effectiveness 2024 Webinar.pptx
Maximizing Board Effectiveness 2024 Webinar.pptxOnBoard
 
Enhancing Worker Digital Experience: A Hands-on Workshop for Partners
Enhancing Worker Digital Experience: A Hands-on Workshop for PartnersEnhancing Worker Digital Experience: A Hands-on Workshop for Partners
Enhancing Worker Digital Experience: A Hands-on Workshop for PartnersThousandEyes
 
Factors to Consider When Choosing Accounts Payable Services Providers.pptx
Factors to Consider When Choosing Accounts Payable Services Providers.pptxFactors to Consider When Choosing Accounts Payable Services Providers.pptx
Factors to Consider When Choosing Accounts Payable Services Providers.pptxKatpro Technologies
 
Beyond Boundaries: Leveraging No-Code Solutions for Industry Innovation
Beyond Boundaries: Leveraging No-Code Solutions for Industry InnovationBeyond Boundaries: Leveraging No-Code Solutions for Industry Innovation
Beyond Boundaries: Leveraging No-Code Solutions for Industry InnovationSafe Software
 

Último (20)

My Hashitalk Indonesia April 2024 Presentation
My Hashitalk Indonesia April 2024 PresentationMy Hashitalk Indonesia April 2024 Presentation
My Hashitalk Indonesia April 2024 Presentation
 
[2024]Digital Global Overview Report 2024 Meltwater.pdf
[2024]Digital Global Overview Report 2024 Meltwater.pdf[2024]Digital Global Overview Report 2024 Meltwater.pdf
[2024]Digital Global Overview Report 2024 Meltwater.pdf
 
The Codex of Business Writing Software for Real-World Solutions 2.pptx
The Codex of Business Writing Software for Real-World Solutions 2.pptxThe Codex of Business Writing Software for Real-World Solutions 2.pptx
The Codex of Business Writing Software for Real-World Solutions 2.pptx
 
Neo4j - How KGs are shaping the future of Generative AI at AWS Summit London ...
Neo4j - How KGs are shaping the future of Generative AI at AWS Summit London ...Neo4j - How KGs are shaping the future of Generative AI at AWS Summit London ...
Neo4j - How KGs are shaping the future of Generative AI at AWS Summit London ...
 
Breaking the Kubernetes Kill Chain: Host Path Mount
Breaking the Kubernetes Kill Chain: Host Path MountBreaking the Kubernetes Kill Chain: Host Path Mount
Breaking the Kubernetes Kill Chain: Host Path Mount
 
04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
04-2024-HHUG-Sales-and-Marketing-Alignment.pptx04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
 
How to convert PDF to text with Nanonets
How to convert PDF to text with NanonetsHow to convert PDF to text with Nanonets
How to convert PDF to text with Nanonets
 
Install Stable Diffusion in windows machine
Install Stable Diffusion in windows machineInstall Stable Diffusion in windows machine
Install Stable Diffusion in windows machine
 
Integration and Automation in Practice: CI/CD in Mule Integration and Automat...
Integration and Automation in Practice: CI/CD in Mule Integration and Automat...Integration and Automation in Practice: CI/CD in Mule Integration and Automat...
Integration and Automation in Practice: CI/CD in Mule Integration and Automat...
 
IAC 2024 - IA Fast Track to Search Focused AI Solutions
IAC 2024 - IA Fast Track to Search Focused AI SolutionsIAC 2024 - IA Fast Track to Search Focused AI Solutions
IAC 2024 - IA Fast Track to Search Focused AI Solutions
 
Scaling API-first – The story of a global engineering organization
Scaling API-first – The story of a global engineering organizationScaling API-first – The story of a global engineering organization
Scaling API-first – The story of a global engineering organization
 
AI as an Interface for Commercial Buildings
AI as an Interface for Commercial BuildingsAI as an Interface for Commercial Buildings
AI as an Interface for Commercial Buildings
 
The 7 Things I Know About Cyber Security After 25 Years | April 2024
The 7 Things I Know About Cyber Security After 25 Years | April 2024The 7 Things I Know About Cyber Security After 25 Years | April 2024
The 7 Things I Know About Cyber Security After 25 Years | April 2024
 
FULL ENJOY 🔝 8264348440 🔝 Call Girls in Diplomatic Enclave | Delhi
FULL ENJOY 🔝 8264348440 🔝 Call Girls in Diplomatic Enclave | DelhiFULL ENJOY 🔝 8264348440 🔝 Call Girls in Diplomatic Enclave | Delhi
FULL ENJOY 🔝 8264348440 🔝 Call Girls in Diplomatic Enclave | Delhi
 
08448380779 Call Girls In Diplomatic Enclave Women Seeking Men
08448380779 Call Girls In Diplomatic Enclave Women Seeking Men08448380779 Call Girls In Diplomatic Enclave Women Seeking Men
08448380779 Call Girls In Diplomatic Enclave Women Seeking Men
 
Tech-Forward - Achieving Business Readiness For Copilot in Microsoft 365
Tech-Forward - Achieving Business Readiness For Copilot in Microsoft 365Tech-Forward - Achieving Business Readiness For Copilot in Microsoft 365
Tech-Forward - Achieving Business Readiness For Copilot in Microsoft 365
 
Maximizing Board Effectiveness 2024 Webinar.pptx
Maximizing Board Effectiveness 2024 Webinar.pptxMaximizing Board Effectiveness 2024 Webinar.pptx
Maximizing Board Effectiveness 2024 Webinar.pptx
 
Enhancing Worker Digital Experience: A Hands-on Workshop for Partners
Enhancing Worker Digital Experience: A Hands-on Workshop for PartnersEnhancing Worker Digital Experience: A Hands-on Workshop for Partners
Enhancing Worker Digital Experience: A Hands-on Workshop for Partners
 
Factors to Consider When Choosing Accounts Payable Services Providers.pptx
Factors to Consider When Choosing Accounts Payable Services Providers.pptxFactors to Consider When Choosing Accounts Payable Services Providers.pptx
Factors to Consider When Choosing Accounts Payable Services Providers.pptx
 
Beyond Boundaries: Leveraging No-Code Solutions for Industry Innovation
Beyond Boundaries: Leveraging No-Code Solutions for Industry InnovationBeyond Boundaries: Leveraging No-Code Solutions for Industry Innovation
Beyond Boundaries: Leveraging No-Code Solutions for Industry Innovation
 

Progressive downloads and rendering (Stoyan Stefanov)

  • 1. Progressive downloads and rendering Stoyan Stefanov, Yahoo! HighLoad++, Moscow, 2010 http://slideshare.net/stoyan/
  • 2. About me YSlow 2.0
  • 4. Importance of performance • Psychology, physiology • Effects of waiting • “Time is money” • Make people happy
  • 9.
  • 10.
  • 11. Time is relative • Sometimes crawls • Sometimes flies • “it depends”
  • 12. Durations actual expected perceived rem’d time
  • 13. It feels slower when… • Unpleasant • Unknown • Boring • Too much to keep track
  • 14. First time experience • Unfamiliar = slow • Optimize empty cache or there will be no full cache
  • 16. But before we begin…
  • 17. The basics • Reducing the # HTTP • Gzip • Minification • Image smushing • Expires • CDN
  • 18. The basics • Yahoo!’s best practices + YSlow http://developer.yahoo.com/performance/ • Google’s too + Page Speed http://code.google.com/speed/
  • 22.
  • 24. Agenda 1. Prevent download blocks: scripts, styles, CC, favicon 2. Ways to render sooner: flush, data URIs, lazy loading, lazy evaluation, preloading, animations
  • 26. JavaScript blocks html js png png
  • 27. JavaScript blocks • A no-no! <script src="jquery.js"></script> <script src="jquery.twitter.js"></script> <script src="jquery.cookie.js"></script> <script src="myapp.js"></script>
  • 28. This waterfall looks ridiculous html js js js js png png
  • 29. JavaScript at the bottom html png png js
  • 30. Non-blocking JavaScript • deferand async • Defer: IE innovation, ok to delay, but keep order • Async: HTML5, whatever <script asyncsrc="my.js" onload="doIt()"></script> <script defer src="my.js" onload="doIt()"></script>
  • 31. defer and async timeline async defer DOMContentLoaded load
  • 32. Non-blocking JavaScript • Asynchronous loading html js png png varh, js= document.createElement('script'); js.src = 'myscript.js'; h= document.getElementsByTagName('head')[0]; h.appendChild(js);
  • 33. Non-blocking JavaScript • Others: - iframe - XHR - <object> -…
  • 36. CSS blocks rendering • The worst component type • Place way at the top •@media print, etc in the same external CSS http://www.phpied.com/delay-loading-your-print-css/ http://www.phpied.com/rendering-styles/
  • 37. CSS
  • 38. CSS
  • 39. CSS block downloads? But they do block: • When followed by an inline script • When in conditional comments
  • 40. Inline CSS • Google search • Bing.com: inline + postload
  • 41. Same domain • If you split across domains • and if you don’t use CDN • Saves a DNS lookup • e.g. Google and Bing’s CDN
  • 44. With conditionally commented CSS file http://www.phpied.com/ conditional-comments-block-downloads/
  • 45. What…?! Case #1 <link type="text/css" rel="stylesheet" href="1.css"> <!--[if IE 6]> <link type="text/css" rel="stylesheet" href="ie.css"> <![endif]-->
  • 46. What…?! Case #2 <!--[if IE 6]> <body class="ie6"> <![endif]--> <!--[if !IE]><!--> <body> <!--<![endif]-->
  • 47. Solution for case #1 <!DOCTYPE html> <!--[if IE 6]><![endif]--> <html> ...
  • 48. Solution for case #2 <!--[if IE 6]> <html class="ie6"> <![endif]--> <!--[if !IE]><!--> <html> <!--<![endif]-->
  • 50.
  • 51. Flush
  • 52. flush() early html  png js css html js png css
  • 53. flush() html head script src=my.js type=text/javascript/script link href=my.css type=text/css rel=stylesheet / /head ?php flush() ? body ....
  • 54. Chunked encoding HTTP/1.1 200 OK Content-Type: text/plain Transfer-Encoding: chunked 25 This is the data in the first chunk 1C and this is the second one 0
  • 55. Chunked encoding • Progressive rendering - Semantic app chunks vs. - Server-level chunks
  • 56. Progressive rendering Chunk #1 Chunk #2 Chunk #3
  • 57. !doctype html html headtitleMy App/title/head body div id=header imgsrc=logo.png / ... /div!-- end of chunk #1 -- ... The full body of the page ... !-- end of chunk #2 -- script src=all_20100925.js/script /body
  • 58. Progressive + source order 1 3 2 4
  • 59. HTTP chunking: not only HTML
  • 60. HTTP chunking: not only HTML • Google Instant • /**/ - delimited JSON pieces • Chunk #1 suggestions • Chunk #2 results http://tinyurl.com/chunkview
  • 62. Fewer HTTP requests • Inline images: in CSS sprites with data: URI scheme http://csssprites.com http://spriteme.org
  • 63. Fewer HTTP requests • data: URI scheme $ php -r echo base64_encode(file_get_contents('my.png'));” iVBORw0KGgoAAAANSUhEUgAAAAQAAAADCAIAAAA7ljmRAAAAGElEQVQIW2P4 DwcMDAxAfBvMAhEQMYgcACEHG8ELxtbPAAAAAElFTkSuQmCC
  • 64. Fewer HTTP requests • data: URI scheme background-image: url(data:image/png;base64,iVBORw0KG...);
  • 65. Fewer HTTP requests • data: URI scheme imgsrc=data:image/png;base64,iVBOR... /
  • 66.
  • 67.
  • 69.
  • 70.
  • 71. Fewer HTTP requests • data: URI scheme • works in IE!...
  • 72. Fewer HTTP requests • data: URI scheme • works in IE8!
  • 73. Fewer HTTP requests • data: URI scheme • MHTML for IE 8
  • 74.
  • 75.
  • 76.
  • 77.
  • 78.
  • 79.
  • 80.
  • 81. MHTML • MIME HTML • Works in IE 6,7 • Indeed it actually absolutely does work in IE7/Vista too http://phpied.com /the-proper-mhtml-syntax/
  • 82. MHTML - one part Content-Location: myimage Content-Transfer-Encoding: base64 iVBORw0KGgoAAAANSU....U5ErkJggg==
  • 83. MHTML - multi parts Content-Type: multipart/related; boundary=MYSEPARATOR --MYSEPARATOR [here comes part one] The double- --MYSEPARATOR dash of doom [here's part two] --MYSEPARATOR--
  • 84. MHTML.css – all together /* Content-Type: multipart/related; boundary=MYSEPARATOR --MYSEPARATOR Content-Location: myimage Content-Transfer-Encoding: base64 iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAMAAADXqc3KAAAD....U5ErkJggg== --MYSEPARATOR Content-Location: another Content-Transfer-Encoding: base64 iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAMAAADXqc3KAAAA....U5ErkJggg== --MYSEPARATOR-- */ .myclass { background-image:url(mhtml:http://example.org/styles.css!myimage); } .myotherclass { background-image:url(mhtml:http://example.org/styles.css!another); }
  • 85. MHTML: inline too !doctype html html head titleLook Ma' No HTTP requests/title style type=text/css /* Content-Type: multipart/related; boundary=_ --_ Content-Location:locoloco Content-Transfer-Encoding:base64 iVBOR...CC --_ Content-Location:polloloco Content-Transfer-Encoding:base64 iVBOR....gg== --_-- */ .image1 { background-image: url(data:image/png;base64,iVBOR...CC); /* normal */ *background-image: url(mhtml:http://...html!locoloco); /* IE 8 */ } .image2 { background-image: url(data:image/png;base64,iVBOR...gg==); /* normal */ *background-image: url(mhtml:http://...html!polloloco); /* IE 8 */ } body { font: bold 24px Arial; } /style /head body h1MHTML + Data:URIs inline in codestyle/code/h1 p class=image1hellobrhello/p http://phpied.com p class=image2bonjourbrbonjour/p /body /html /inline-mhtml-data-uris/
  • 86. !doctype html html head titleLook Ma' No HTTP requests/title style type=text/css ...
  • 88. .image1 { background-image: url(data:image/png;base64,iVBOR...CC); /* normal */ *background-image: url(mhtml:http://...html!locoloco); /* IE 8 */ } .image2 { background-image: url(data:image/png;base64,iVBOR...gg==); /* normal */ *background-image: url(mhtml:http://...html!polloloco); /* IE 8 */ } body { font: bold 24px Arial; }
  • 89. ... /style /head body h1MHTML + Data:URIs inline in codestyle/code/h1 p class=image1hellobrhello/p p class=image2bonjourbrbonjour/p /body /html
  • 90. MHTML + data URI • X-browser single request web apps
  • 91. Single request • WT☠? • Separation of concerns • Content-presentation- behavior • yes, it’s a tradeoff
  • 92. MHTML + data URI • drawback: repeats the same encoded image • solutions: - browser-specific CSS - keep close = better gzip - or… an ingenious hack
  • 93. Single stream MHTML/data URI • image header + css + data /9j/4AA0;background-image:url(data:image/jpeg;base64;00,/9j/4AA0 Reality: IE: Others: http://habrahabr.ru/blogs/webdev/90761/
  • 94. /* Content-Type: multipart/related; boundary=granitza --granitza Content-Type: text/css; */ #myid { /* --granitza Content-Location: myimage Content-Transfer-Encoding: base64 Content-Type: image/jpeg;*/ /9j/4AA0;background-image:url(data:image/jpeg;base64;00,/9j/4AAQSkZJRgA...); /* --granitza Content-Type: text/css; */ background-image: url(mhtml:http://localhost/my.css!myimage) !ie; } /* --granitza-- */
  • 95. /* Content-Type: multipart/related; boundary=granitza --granitza Content-Type: text/css; */ ??? #myid { /* --granitza Content-Location: myimage Content-Transfer-Encoding: base64 Content-Type: image/jpeg;*/ /9j/4AA0;background-image:url(data:image/jpeg;base64;00,/9j/4AAQSkZJRgA...); /* --granitza Content-Type: text/css; */ background-image: url(mhtml:http://localhost/my.css!myimage) !ie; } /* --granitza-- */
  • 96. /* Content-Type: multipart/related; boundary=granitza --granitza Content-Type: text/css; */ #myid { /* --granitza Content-Location: myimage Content-Transfer-Encoding: base64 Content-Type: image/jpeg;*/ /9j/4AA0;background-image:url(data:image/jpeg;base64;00,/9j/4AAQSkZJRgA...); /* --granitza Content-Type: text/css; */ background-image: url(mhtml:http://localhost/my.css!myimage) !ie; } /* --granitza-- */
  • 97. /* Content-Type: multipart/related; boundary=granitza --granitza Content-Type: text/css; */ 1 ??? #myid { /* --granitza Content-Location: myimage 2 Content-Transfer-Encoding: base64 Content-Type: image/jpeg;*/ /9j/4AA0;background-image:url(data:image/jpeg;base64;00,/9j/4AAQSkZJRgA...); /* --granitza Content-Type: text/css; */ background-image: url(mhtml:http://localhost/my.css!myimage) !ie; 3 } /* --granitza-- */
  • 98. Single stream MHTML/data URI • And for img too!
  • 99. Single stream img h2Hello Kitty/h2 ! --granitza Content-Location: myimage Content-Transfer-Encoding: base64 Content-Type: image/gif 2 invalid MHTML headers lines followed by data--![if gt IE 7] img width=16 height=16 src=data:image/gif;base64, R0lGODl ... FxMKVvDijNQaodOl+N5Pk+pmIX7brGweCg4SCEhEAOw==![endif] !--[if lt IE 8] imgsrc=mhtml:http://.../bolknote.html!myimage width=16 height=16 ![endif]-- p more page... /p
  • 100. Single stream img h2Hello Kitty/h2 ! --granitza Content-Location: myimage Content-Transfer-Encoding: base64 Content-Type: image/gif 2 invalid MHTML headers lines followed by data--![if gt IE 7] img width=16 height=16 src=data:image/gif;base64, R0lGODl ... FxMKVvDijNQaodOl+N5Pk+pmIX7brGweCg4SCEhEAOw==![endif] !--[if lt IE 8] imgsrc=mhtml:http://.../bolknote.html!myimage width=16 height=16 ![endif]-- p more page... /p
  • 102. Lazy loading aka post-loading • After-onload • Some images • Below the fold (on scroll) • Hidden content e.g. tabs
  • 103.
  • 104.
  • 105. Amazon’s lazy bestsellers • Page’s purpose is ranking • Details can come later • via onload XHR • JS off = no details • but that’s fine (see bullet #1)
  • 107. GMail mobile’s lazy JS !doctype html htmlbody ... scriptid=lazy/* console.log(I can wait); *//script ... script console.log(I'm needed); window.onload = function () { var comment = document.getElementById('lazy') .innerHTML, code = comment.substring(3, comment.length - 3); eval(code); }; /script http://googlecode.blogspot.com/2009/09 /body/html /gmail-for-mobile-html5-series-reducing.html
  • 108.
  • 109. Lazy HTML !doctype html htmlbody ... divid=lazy!-- plots of html goes here.../p --/div ... script window.onload= function () { var el = document.getElementById('lazy'), inner = el.innerHTML, code = inner.substring(4, inner.length- 3); el.innerHTML = code; }; /script /body/html http://phpied.com... (coming-soon)
  • 110. Lazy HTML test •500K (200K gzipped) HTML doc • “Sherlock Holmes” • comment out 95% • still one whole chapter left http://www.phpied.com/files/lazyhtml/start.html
  • 111. Lazy HTML test results
  • 112. Lazy HTML - misc • Who loads a book? • Use case: blog comments • SEO? Content is hidden • What about display: none? • The test page was simple-to- render, no complex layout
  • 114. Preloads • Anticipate next page • Problems: - does next page anticipate you? - parsing and execution time •link prefetch=http://..
  • 115. Preload sans execute varpreload; if (/*@cc_on!@*/false) { // IE preload = function (file) { new Image().src = file; }; } else { preload = function (file) { varobj = document.createElement('object'), body = document.body; obj.width = 0; obj.height = 0; obj.data = file; body.appendChild(obj); }; }
  • 116. Preload, then execute varloader = function (file, callback) { varobj = document.createElement('object'), body = document.body; obj.width = 0; obj.height = 0; obj.data = file; obj.onload = function () { varh,js= document.createElement('script'); js.src =file; js.onload=callback; h = document.getElementsByTagName('head')[0]; h.appendChild(js); }; body.appendChild(obj); };
  • 118. Chrome search • In-browser search box • Gives suggestions as you type • Visual suggestions in IE8+
  • 119. IE8 Visual Search Suggestions ... Item TextCurrently: Partly Cloudy, 67F/Text DescriptionHigh: 71F Low: 63F/Description Urlhttp://weather.yahoo.com/forecast/USCA1024_f.html/Url Image source=http://l.yimg.com/a/i/us/we/31/30.gif alt=Partly Cloudy width=31 height=31/ /Item ...
  • 120. IE8 Visual Search Preload ... Item Textany search suggestion/Text Image source=http://path/to/sprite.png width=0 height=0/ /Item ...
  • 121. IE8 Visual Search Preload
  • 122. IE8 Visual Search Preload • didn’t work for CSS and JS
  • 123. IE8 Visual Search • preload images, e.g. sprite • DNS lookups via beacons
  • 125. Do care about • Progressive, non-blocking, asynchronous downloads • Progressive rendering

Notas del editor

  1. c
  2. Dev process, philosophy
  3. Non-blockingasynchronousFree-falling waterfalls
  4. Rendering something quickly ~200ms - instanteneous
  5. redesign
  6. c
  7. c
  8. c
  9. c
  10. - 3 times faster on 3G, 4 and 1/2 times faster on WiFi - still faster after evaluation - DOMContentLoaded happens sooner
  11. S
  12. S
  13. S
  14. S
  15. S
  16. Showing something in 200 ms is incredible, users will love it