Internet Info, s.r.o. Lupa Root Měšec Podnikatel DigiZone Slunečnice Vitalianew Bomba Navrcholu Weblogy Jagg Woko Dobrý web Computer.cz SK: MojeLinky
Lupa.czBlogyRailsWorx Warťásek

Zrychlujeme web

David Schovanec, 9. 11. 2009, 10:20 v kategorii Optimalizace, Programování, Webdesign, štítky: , ,

Úvodem je nutno připomenout, že neexistuje žádný konkrétní způsob, kterak načítání a samotný chod webové stránky urychlit. Vždy se jedná jen o sadu pravidel a triků, kterak zoptimalizovat stávající stav.

Každý požadavek je drahý

Browser musí nejdříve získat z názvu domény adresu, navázat TCP spojení a poté si vyžádat stránku, styly, scripty a obrázky. I když je naše "vzdálenost" k serveru třebas jen 20ms, musíme to vynásobit počtem požadavků.

  • 1x DNS lookup
  • 1x navázání TCP spojení
  • 1x požadavek na získání samotné stránky
  • + 1 pokud dojde k redirectu
  • 1x pro každý styl
  • 1x pro každý externí script
  • 1x pro každý obrázek (v css, nebo ve stránce)

Tím samotný výčet zpomalení nekončí. Stránka se musí před zobrazením "sestavit." Tedy aplikuji se styly a provede se javascript. Ale i to se dá optimalizovat.

Co s tím ?

Při optimalizaci se nám bude hodit projekt Browserscope, kde najdeme informace a statistiky jednotlivých prohlížečů.

DNS + TCP

S tímto nic nenaděláme. Potřebuje to pro základní komunikaci mezi browserem a serverem.

Hlavní stránka + redirect

Se samotnou stránkou toho také moc nenaděláme. Některé framworky ale podporují přesměrování na straně serveru. Tím se ušetří jeden požadavek.

Kaskádové styly

Komprese
  • Všechny styly dát pouze do jednoho souboru a použít komprimačńí nástroj na zmenšení samotné velikosti
  • Můžeme použít například [webový nástroj csscompressor
  • Nebo na straně serveru ruby knihovnu a mít aktuální výsledek po dobu jedné revize aplikace
Optimalizace

Používat co nejpopisnější css selektory, abychom odlehčili rendrovacímu nástroji

div.selected {width:500px;height:500px}
div.selected > span {background-color:red}
div.selected > span.inactive {background-color:gray}

Scripty

Komprese kódu

Můžeme použít například službu od googlu. A nebo použít celý projekt s možností stáhnutí javovského programu a použít ho stejně jako css kompresor na straně serveru. Tento nástroj slouží zároveň jako validátor, odstraňuje takzvaně mrtvý kód (což mnohdy není úplně ideální, jelikož ho můžeme volat odjinud) a kód zároveň optimalizuje.

Příklady

//Vstup
var height = 50;
var heightAdd = 25;
function tellMeWidth() {
alert(height + heightAdd);
}
tellMeWidth()

Použití maximální komprese a optimalizace

Kompresor v tomto režimu nepracuje jen s kódem samotným, ale i celým kontextem. Sečte proměnné a odstraní celé volání metody, jelikož v daném kontextu není použito jinak

alert(75);

Použití obyčejné komprese

var a=50,b=25;function c(){alert(a+b)};c();

Či jen odstranění "white spaces"

var height=50,heightAdd=25;function tellMeWidth(){alert(height+heightAdd)}tellMeWidth();

Programátorská optimalizace
  • Důležité je kód psát tak, aby byl rychlý, přehledný a nedocházelo v něm k zbytečným operacím
  • Nenačítat kód, který na stránce nepoužíváme
  • Kód, který používáme, ale nepotřebujeme ho při inicializaci stránky (například nějaké komponenty jako je kalendář, autocompleter apod.) načítat až poté

Obrázky

CSS pozadí

Zde je jen použití triku, kdy se všechny obrázky tvořící pozadí a nemají nastavenou vlastnost repeat uloží do jednoho obrázku a jejich umístění se určuje pomocí souřadnic

body.background-main-bg * {
background-image: url(main-bg.png);
background-color:transparent;
background-repeat: no-repeat;
background-position: -10000px -10000px;}
.album_bg {background-position: 0px 0px !important;}
.bg_reg_button {background-position: 85px 0px !important;}
.bg_reg_button_yellow {background-position: 107px 0px !important;}
.bg_reg_button_green {background-position: 129px 0px !important;}
.ikona {background-position: 151px 0px !important;}
.ico_concepts {background-position: 151px 41px !important;}

Obrázky ve stránce

Toto se dá řešit jedině pomocí javascriptu, kdy obrázky, které nejsou vidět při úvodním zobrazení načteme později například pomocí pluginu v jQuery LayzyLoad


Článek inspirován přednáškou Make the web faster na Google Developer Day 2009

Komentáře (13)

  1. 9. 11. 2009, 16:13 Noby napsal:

    K čemu to? Budou závody webových stránek?

  2. 9. 11. 2009, 18:20 Lukáš Svoboda napsal:

    Zdravím,
    Rozhodně doporučuji další práci s
    Cache-Control a gzipem
    Accept-Encoding: gzip, deflate
    Content-Encoding: gzip
    podle mého asi nejdůležitější,.
    jinak více zde http://developer.yahoo.com/performance/rules.html

  3. 9. 11. 2009, 18:50 WuDo napsal:

    Pokud by všechny grafické prvky (v css) byly uloženy v jednom souboru, tak se všechny zobrazí až poté, co tento soubor bude natažen

    x

    Snést drobně větší komunikaci mezi serverem a browserem, ale uživateli se grafika načítá postupně => tím minimálně vidí, že se něco děje....

    U mě vítězí druhá možnost...

  4. 9. 11. 2009, 19:28 Petr napsal:

    Dlouho jsem se takhle nezasmál, díky Noby

  5. 9. 11. 2009, 21:29 Petr napsal:

    Jak zrychlit web? To co je výše popsané samozřejmě pomůže, ale základem je rychlé generování samotných stránek na serveru. Pokud web pojede na pomalém nebo přetíženém serveru, nebo jestli to bude nějaký "slepenec" amatérských kódů nalezených na internetu - tak tomu už nepomůže ani světcená voda.

  6. 9. 11. 2009, 23:14 Eduard Hlava napsal:

    Tohleto ladění je fajn, zejména u webů, které mají obrovkou návštěvnost. Ale dokud vám to bude zdržovat databáze, která je většinou na vině toho, že je web pomalý (resp. DB má šílenou strukturu a dotazy stojí za prd), pak vám nějaké tisícinky v podobě komprese css kódu nepomůžou.

  7. 9. 11. 2009, 23:45 Labir napsal:

    Mě hodně pomohlo vhodné napsání frameworku - nejlépe s dvojitým bufferováním, popré nabufferuje analýzu HTML šablony takže generátor vkládající hodnoty již ví kam co vložit a podruhé když to lze tak bufferovat celý výstup podle analýzy vstupů (post/get/cookie/db/files). Drtivá většina zobrazení stránek zobrazuje stále totéž, změna nastává jen v případě změny vstupu - parametrů, změně použitých tabulek databáze nebo datových souborů což se z hlediska návštěvnosti děje jen zřídka. Takže většinou se prostě jen načte a zobrazí hotové HTML, u často navštěvovaných stránek se soubor s bufferem vejde do cache takže je to hned.

  8. 10. 11. 2009, 10:13 Lukáš Svoboda napsal:

    Eduard Hlava: přesně s Vámi souhlasím, pokud se používá špatně navržená db tak je to hřebík, který je smrtící. Bohužel je to velmi častý jev projektů a to z jednoduchého důvodu,. Zákazník,. pokud zákázník od začátku nepočítá s rozšiřováním základních prvků webů, web app, tak je následné dolepování funkčností často problematické a to samozřejmě pokud se bavím o termínu ASAP.
    Jinak myslím, že popsaný techniky opravdu počítají s dobrým databázovým návrhem a proto je to tu vlastně bezpředmětné řešit.

  9. 10. 11. 2009, 15:34 Eduard Hlava napsal:

    Labir: jojo, bufferováni (u nás tomu říkáme cachování) je základ jakéhokoliv redakčního, publikačního a content management systému. My máme těch úrovní víc (cache modulů, cache pro celou page, cache podmíněná apod.) ... pak se dá udělat to, že se cachuje jen část stránky která se nemění (záhlaví apod.), zbytek se vůbec třeba nekešuje a při zobrazení stránky tak třeba místo 10 dotazů do DB jde jen jeden, ale vše je stále aktuální... Je to pár měsíců zpátky, co jsme na jednom serveru (apahe, php, mysql dohromady) utáhli celkem v pohodě web, který měl skoro 1,2 milionu pageviews za 24 hodin, takže ve špičkách to byl docela frkot.

    A samozřejmě při takovémhle provozu už se projeví i pár ušetřených kB v CSS či výsledném html, takže to samozřejmě pak význam má. Spíš v tom smyslu, že se šetří přenosové pásmo.

  10. 10. 11. 2009, 19:37 polygon napsal:

    Podle me jsou tohle vsechno zbytecne snahy. O rychlost by se mel starat predevsim http server podporou transportni komprese a cashovani. Pochybuju, ze odstraneni white space nejak vyznamne pomuze gzipu.
    Pokud je web i pres to pomaly pak je pomala bud aplikace nebo databaze a v takovem pripade optimalizace nacitani stranek do browseru nijak veci nepomuze.

    LazyLoad - v principu to zni logicky, ale v praxi bych doporucil se spise zamyslet nad tim, jestli je potreba opravdu nacitat na strance tolik dat a nebylo by lepsi spise provest urcite odlehceni, nez nacitat dodatecne dalsi komponenty. LazyLoad je totiz navrzen pro pouziti v trochu jinych situacich. (Dlouha ws volani, zpracovani dat na serveru se zobrazenim vysledku, ...)

    "Drahost pozadavku" - obavam se, ze odezvy pozadavku nelze proste poscitat. Browser totiz po ziskani html kodu stranky neni omezen na stahovani stylu a obrazku po jednom.

  11. 11. 11. 2009, 09:08 Martin Popelak napsal:

    @10 tohle je ale za predpokladu toho, ze samozreme http server mate naskalovany na maximum a skvele nastaveny. To same plati pro to, ze vam stiha databaze a vsechno. Samozrejme jestli mate problemy jinde, tak tohle vam nepomuze...

  12. 12. 11. 2009, 17:30 motyq napsal:

    a co jeste k tomu pridat reverse proxy pripadne i neco cachovat s ttl treba 1minuta? prijde mi zbytecne aby styly serviroval "velky" webserver na kterem jede primo aplikace. Tedy styly + statiku (ikonky kravinky okolo) vydavat primo reverzni proxynou + inteligentni cachovani na zaklade uri a zbytek nechat propadnout na webserver.
    Mozna to tak mate, ale v clanku jsem tuto variantu nevidel.
    btw - jako reverse/proxy cache v pripade nejakeho takovehoto reseni velice doporucuju nginx :)

  13. 12. 11. 2009, 17:32 motyq napsal:

    jeste jsem zapomel, zapnout pak na te proxyne keepalive a na webserveru ji vypnout :)

Přidej komentář