SlideShare a Scribd company logo
1 of 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/

More Related Content

Viewers also liked

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
 

Viewers also liked (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 to 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 to 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
 

More from 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
 

More from 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...
 

Recently uploaded

My INSURER PTE LTD - Insurtech Innovation Award 2024
My INSURER PTE LTD - Insurtech Innovation Award 2024My INSURER PTE LTD - Insurtech Innovation Award 2024
My INSURER PTE LTD - Insurtech Innovation Award 2024The Digital Insurer
 
"Federated learning: out of reach no matter how close",Oleksandr Lapshyn
"Federated learning: out of reach no matter how close",Oleksandr Lapshyn"Federated learning: out of reach no matter how close",Oleksandr Lapshyn
"Federated learning: out of reach no matter how close",Oleksandr LapshynFwdays
 
Search Engine Optimization SEO PDF for 2024.pdf
Search Engine Optimization SEO PDF for 2024.pdfSearch Engine Optimization SEO PDF for 2024.pdf
Search Engine Optimization SEO PDF for 2024.pdfRankYa
 
Tampa BSides - Chef's Tour of Microsoft Security Adoption Framework (SAF)
Tampa BSides - Chef's Tour of Microsoft Security Adoption Framework (SAF)Tampa BSides - Chef's Tour of Microsoft Security Adoption Framework (SAF)
Tampa BSides - Chef's Tour of Microsoft Security Adoption Framework (SAF)Mark Simos
 
DevEX - reference for building teams, processes, and platforms
DevEX - reference for building teams, processes, and platformsDevEX - reference for building teams, processes, and platforms
DevEX - reference for building teams, processes, and platformsSergiu Bodiu
 
Commit 2024 - Secret Management made easy
Commit 2024 - Secret Management made easyCommit 2024 - Secret Management made easy
Commit 2024 - Secret Management made easyAlfredo García Lavilla
 
Advanced Test Driven-Development @ php[tek] 2024
Advanced Test Driven-Development @ php[tek] 2024Advanced Test Driven-Development @ php[tek] 2024
Advanced Test Driven-Development @ php[tek] 2024Scott Keck-Warren
 
SIP trunking in Janus @ Kamailio World 2024
SIP trunking in Janus @ Kamailio World 2024SIP trunking in Janus @ Kamailio World 2024
SIP trunking in Janus @ Kamailio World 2024Lorenzo Miniero
 
Designing IA for AI - Information Architecture Conference 2024
Designing IA for AI - Information Architecture Conference 2024Designing IA for AI - Information Architecture Conference 2024
Designing IA for AI - Information Architecture Conference 2024Enterprise Knowledge
 
Scanning the Internet for External Cloud Exposures via SSL Certs
Scanning the Internet for External Cloud Exposures via SSL CertsScanning the Internet for External Cloud Exposures via SSL Certs
Scanning the Internet for External Cloud Exposures via SSL CertsRizwan Syed
 
"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack
"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack
"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek SchlawackFwdays
 
Vertex AI Gemini Prompt Engineering Tips
Vertex AI Gemini Prompt Engineering TipsVertex AI Gemini Prompt Engineering Tips
Vertex AI Gemini Prompt Engineering TipsMiki Katsuragi
 
Powerpoint exploring the locations used in television show Time Clash
Powerpoint exploring the locations used in television show Time ClashPowerpoint exploring the locations used in television show Time Clash
Powerpoint exploring the locations used in television show Time Clashcharlottematthew16
 
Ensuring Technical Readiness For Copilot in Microsoft 365
Ensuring Technical Readiness For Copilot in Microsoft 365Ensuring Technical Readiness For Copilot in Microsoft 365
Ensuring Technical Readiness For Copilot in Microsoft 3652toLead Limited
 
Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024BookNet Canada
 
Streamlining Python Development: A Guide to a Modern Project Setup
Streamlining Python Development: A Guide to a Modern Project SetupStreamlining Python Development: A Guide to a Modern Project Setup
Streamlining Python Development: A Guide to a Modern Project SetupFlorian Wilhelm
 
Developer Data Modeling Mistakes: From Postgres to NoSQL
Developer Data Modeling Mistakes: From Postgres to NoSQLDeveloper Data Modeling Mistakes: From Postgres to NoSQL
Developer Data Modeling Mistakes: From Postgres to NoSQLScyllaDB
 
"Debugging python applications inside k8s environment", Andrii Soldatenko
"Debugging python applications inside k8s environment", Andrii Soldatenko"Debugging python applications inside k8s environment", Andrii Soldatenko
"Debugging python applications inside k8s environment", Andrii SoldatenkoFwdays
 
Kotlin Multiplatform & Compose Multiplatform - Starter kit for pragmatics
Kotlin Multiplatform & Compose Multiplatform - Starter kit for pragmaticsKotlin Multiplatform & Compose Multiplatform - Starter kit for pragmatics
Kotlin Multiplatform & Compose Multiplatform - Starter kit for pragmaticscarlostorres15106
 

Recently uploaded (20)

My INSURER PTE LTD - Insurtech Innovation Award 2024
My INSURER PTE LTD - Insurtech Innovation Award 2024My INSURER PTE LTD - Insurtech Innovation Award 2024
My INSURER PTE LTD - Insurtech Innovation Award 2024
 
"Federated learning: out of reach no matter how close",Oleksandr Lapshyn
"Federated learning: out of reach no matter how close",Oleksandr Lapshyn"Federated learning: out of reach no matter how close",Oleksandr Lapshyn
"Federated learning: out of reach no matter how close",Oleksandr Lapshyn
 
Search Engine Optimization SEO PDF for 2024.pdf
Search Engine Optimization SEO PDF for 2024.pdfSearch Engine Optimization SEO PDF for 2024.pdf
Search Engine Optimization SEO PDF for 2024.pdf
 
DMCC Future of Trade Web3 - Special Edition
DMCC Future of Trade Web3 - Special EditionDMCC Future of Trade Web3 - Special Edition
DMCC Future of Trade Web3 - Special Edition
 
Tampa BSides - Chef's Tour of Microsoft Security Adoption Framework (SAF)
Tampa BSides - Chef's Tour of Microsoft Security Adoption Framework (SAF)Tampa BSides - Chef's Tour of Microsoft Security Adoption Framework (SAF)
Tampa BSides - Chef's Tour of Microsoft Security Adoption Framework (SAF)
 
DevEX - reference for building teams, processes, and platforms
DevEX - reference for building teams, processes, and platformsDevEX - reference for building teams, processes, and platforms
DevEX - reference for building teams, processes, and platforms
 
Commit 2024 - Secret Management made easy
Commit 2024 - Secret Management made easyCommit 2024 - Secret Management made easy
Commit 2024 - Secret Management made easy
 
Advanced Test Driven-Development @ php[tek] 2024
Advanced Test Driven-Development @ php[tek] 2024Advanced Test Driven-Development @ php[tek] 2024
Advanced Test Driven-Development @ php[tek] 2024
 
SIP trunking in Janus @ Kamailio World 2024
SIP trunking in Janus @ Kamailio World 2024SIP trunking in Janus @ Kamailio World 2024
SIP trunking in Janus @ Kamailio World 2024
 
Designing IA for AI - Information Architecture Conference 2024
Designing IA for AI - Information Architecture Conference 2024Designing IA for AI - Information Architecture Conference 2024
Designing IA for AI - Information Architecture Conference 2024
 
Scanning the Internet for External Cloud Exposures via SSL Certs
Scanning the Internet for External Cloud Exposures via SSL CertsScanning the Internet for External Cloud Exposures via SSL Certs
Scanning the Internet for External Cloud Exposures via SSL Certs
 
"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack
"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack
"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack
 
Vertex AI Gemini Prompt Engineering Tips
Vertex AI Gemini Prompt Engineering TipsVertex AI Gemini Prompt Engineering Tips
Vertex AI Gemini Prompt Engineering Tips
 
Powerpoint exploring the locations used in television show Time Clash
Powerpoint exploring the locations used in television show Time ClashPowerpoint exploring the locations used in television show Time Clash
Powerpoint exploring the locations used in television show Time Clash
 
Ensuring Technical Readiness For Copilot in Microsoft 365
Ensuring Technical Readiness For Copilot in Microsoft 365Ensuring Technical Readiness For Copilot in Microsoft 365
Ensuring Technical Readiness For Copilot in Microsoft 365
 
Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
 
Streamlining Python Development: A Guide to a Modern Project Setup
Streamlining Python Development: A Guide to a Modern Project SetupStreamlining Python Development: A Guide to a Modern Project Setup
Streamlining Python Development: A Guide to a Modern Project Setup
 
Developer Data Modeling Mistakes: From Postgres to NoSQL
Developer Data Modeling Mistakes: From Postgres to NoSQLDeveloper Data Modeling Mistakes: From Postgres to NoSQL
Developer Data Modeling Mistakes: From Postgres to NoSQL
 
"Debugging python applications inside k8s environment", Andrii Soldatenko
"Debugging python applications inside k8s environment", Andrii Soldatenko"Debugging python applications inside k8s environment", Andrii Soldatenko
"Debugging python applications inside k8s environment", Andrii Soldatenko
 
Kotlin Multiplatform & Compose Multiplatform - Starter kit for pragmatics
Kotlin Multiplatform & Compose Multiplatform - Starter kit for pragmaticsKotlin Multiplatform & Compose Multiplatform - Starter kit for pragmatics
Kotlin Multiplatform & Compose Multiplatform - Starter kit for pragmatics
 

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

Editor's Notes

  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