Šuplík Honzy Hučína

Skok na navigaci (menu)

Tento blog je v současné době uzavřen.
Pokračování blogu na bloguje.cz jsem zrušil. Pokud budu někdy pokračovat, bude to spíš tady.

Komentovaný článek

Internet a vše kolem
2. 12. 2004

Podivné plynutí času při načítání

Při načítání webové stránky se čas asi zpomalí a těsně před událostí onLoad naopak šíleně zrychlí. Jinak nevím, jak si vysvětlit, proč mezi dvěma událostmi, které dělí načtení přibližně 60 KB kódu, uplyne podle Javascriptu kratší čas než mezi událostmi, mezi nimiž se už skoro nic nenačítá.

Tohle záhadné chování zkazilo Yuhůovi dobře vymyšlené měření. Podstatou měření bylo, že na začátek a konec těla stránky se dala dvě místa, kdy se pomocí Javascriptu zaznamenal aktuální čas na počítači uživatele. Mezi měřicími místy bylo několik desítek KB. Logická úvaha říkala: jak uživatel stránku načítá, tato se postupně zpracovává a vykresluje; tudíž volání Javascriptu v měřicích místech odpovídá skutečnému času, kdy řádek s tímto voláním dorazil po síti do počítače uživatele a byl zpracován. Rozdíl časů v obou měřicích místech by pak měl odpovídat době, za kterou se přenesl kód mezi nimi.

Ukázalo se ovšem, že tohle z nějakého důvodu nefunguje. Časové rozdíly, které Yuhů zjistil z logu Českého hostingu a do nichž mě nechal nahlédnout, byly neuvěřitelně malé (asi 10 % z nich bylo menších než 20 ms, což by v přepočtu znamenalo rychlosti přes 2 MB/s).

Pokoušel jsem se to vysvětlit kešováním stránky a kompresí (že by se stránka prostě nejdřív přenesla zkomprimovaná a zpracovala naráz, což by vysvětlovalo tak malé rozdíly času). A pro kontrolu jsem začal měřit také, vypnul kešování a přidal ještě jeden měřicí bod na událost onLoad. Počet měření zatím není nijak velký, ale jedno je jasné: časové rozdíly mezi začátkem a koncem těla stránky jsou v naprosté většině případů mnohem menší než rozdíly mezi koncem stránky a událostí onLoad. Podotýkám, že v měřicí stránce nemám žádné obrázky ani počitadlo.

Tomu nerozumím. Co trvá tak dlouho mezi zpracováním posledních řádků a událostí onLoad? A jak to, že mezi krajními body zpracování 60 KB je tak malý čas? Napadá mě snad jen to, že se možná stránka někde předzpracovává a javascripty volají ještě dřív, než dorazí ke klientovi. Ale to je skoro sci-fi.

Aktualizace: Z článku Dave Hyatta (via komentář Milana Kryla, David Majda) vyplývá, že prohlížeče nevykreslují stránku přesně průběžně, jak dorážejí data. Nejdřív si kus stránky nakřečkují a až ve chvíli, kdy si na to troufnou, začnou vytvářet renderovací strom (rendering tree). To by teoreticky mohlo vysvětlovat, proč je mezi zpracováním začátku a konce stránky tak malý časový rozdíl.

Vložit vlastní komentářNávrat k článkuRSS komentářů tohoto článku

Komentáře

[1] 2. 12. 2004, 12:26 – Milan Kryl (Odkaz)

Doporucuju procist clanek, ktery odkazoval D. Majda

http://www.majda.cz/zapisnik/permalink.php?idart=124

[2] 2. 12. 2004, 12:27 – dgx (Odkaz)

hypotézy:

1) měl ten skript prováděný na začátku stránky nějaký výstup (výpis textu, změna css, zkrátka něco viditelného)? Není možné, že prohlížeč s provedením "odložitelných" skriptů počká?

2) není problém jen ve funkci vracející čas? Třeba během načítání stránky mystifikuje

[3] 2. 12. 2004, 12:43 – Honza Hučín (Odkaz)

Ad [2]: To jsou zajímavé myšlenky. Skripty v těle používají document.write pro vypsání měřicí tečky (průhledného obrázku 1x1). To by měl prohlížeč asi provést hned. Ve všech případech se čas odečítá postupem typu
cas=new Date(); ... "&cas="+cas.getTime()

Napadlo mě, že ta velká díra mezi koncem stránky a onLoad může být daná tím, že se čeká na vyřízení http požadavků na měřicí tečky apod. Ovšem nevysvětluje to ty malé rozdíly mezi začátkem a koncem stránky.

Jdu si přečíst článek, na který odkazuje Milan v [1].

[4] 2. 12. 2004, 14:30 – pachollini (Odkaz)

Mám takový pocit, že onload vznikne až při načtení stránky vč. všech obrázků etc., ale 100% jistý si teď nejsem.

[5] 2. 12. 2004, 14:59 – llook (Odkaz)

Nevím, jestli to pomůže, ale jestli je testovací stránka v PHP, tak by mohlo hnout výsledky přidání flush(); za ten skript na začátku stránky.

Pak mě ještě napadá, že je pro onload nějaký složitý kód, který se interpretuje déle.

[6] 2. 12. 2004, 15:23 – Yuhů (Odkaz)

onload se stane až po přijetí všech obrázků

[7] 2. 12. 2004, 15:53 – Leo

Je to tak - onload nastane pri natazeni nejen celeho HTML kodu, ale az po vsech udalostech onload (pripadne onerror) obrazku, a zrejme taky az po nacteni vsech externich souboru. Jestli se do toho pocitaji i background-image v CSS nevim, ale vyzkousim. Leos Ondra

[8] 2. 12. 2004, 15:56 – Leo

A kdyz uz jsme u toho - prestante uz vsichni pouzivat ten tvar onLoad, nevim, odkud se vzal, ale je spatne - zaprve v XHTML zalezi na velikostech pismen, takze tam L nema co delat, a i kdyz v HTML je to jedno pokud je to atribut v uvodnim tagu elementu, tak je to prinejmensim spatny zvyk protoze onLoad v JavaScriptu uz fungovat nebude - ten je dusledne case sensitive... Leos Ondra

[9] 2. 12. 2004, 18:46 – Honza Hučín (Odkaz)

[4],[6] Ano, s tím jsem počítal. Na testovací stránce nemám žádné obrázky ani styly.
[5] Testovací stránka je v PHP, ale jen z mé pohodlnosti. Případné zdržení inicializací PHP a vygenerováním stránky serverem by asi nemělo mít vliv na rozdíly mezi časy volání JS, protože to se provádí u klienta, ne?

[10] 3. 12. 2004, 07:02 – llook (Odkaz)

[8] Já vím, kde se vzal, může za to Netscape. V referenci JS 1.3 je v příkladech v HTML všude onLoad.

Jak se vlastně Javascript zpracovává? Je to opravdu interpretovaný jako třeba Bash, nebo se to před prováděním nějak parsuje jako třeba PHP? Jestli se to parsuje, tak se nabízí otázka, kdy se to parsuje.

[11] 3. 12. 2004, 08:12 – Honza Hučín (Odkaz)

[10] Z článku Dave Hyatta, na který se dá dostat přes odkaz v [1], jsem získal názor, že se JS nepředzpracovává, ale interpretuje při vytváření renderovacího stromu. Ovšem netvrdím, že jsem to pochopil přesně.

[12] 3. 12. 2004, 08:14 – Honza Hučín (Odkaz)

[8] Já se polepším... :-)

[13] 3. 12. 2004, 17:30 – Leo

"Jak se vlastně Javascript zpracovává? Je to opravdu interpretovaný jako třeba Bash, nebo se to před prováděním nějak parsuje jako třeba PHP? Jestli se to parsuje, tak se nabízí otázka, kdy se to parsuje."

Muzete mi to prelozit do cestiny? :-) Jaky je mezi tim rozdil a jak by se to projevilo (melo projevit) prakticky? Leo

[14] 3. 12. 2004, 17:31 – Leo

[10] Jinak diky, takze Netscape :-) Leo

[15] 12. 12. 2004, 11:11 – Leo

[10] JavaScript napriklad dela tu vec, ze deklarace funkci zpracovava pred vykonanim kodu, takze je napriklad mozne napsat

<script>
a = nasobdvema(2); // volani fce pred jeji deklaraci
function nasobdvema(x) {return x*2}
alert(a); // vypise 4
</script>

Ale plati to jen v danem elementu <script> - pokud v jednom elementu <script> fci zavolate a v jinem (pozdeji) ji teprve deklarujete, tak to ohlasi chybu. Takze prohlizec si to preklada po elementech script a pak to teprve provadi.

Leos Ondra

K tomuto článku není možné vkládat komentáře.

© Honza Hučín 2004–6

Šuplík běží na PIPNI.CZ. Díky!

sber.cermat.cz

RSS Šuplíku

RSS komentářů – souhrnně

U každého článku je samostatný RSS kanál pro komentáře.

Výběr článků

Posledních 10 článků

nebo podle data:

nebo hledání fulltextem:

Archiv všech článků

Poslední komentáře

Zabili mě, parchanti [2]

8. 8. 16:48 | Pepa

Cestou kolem blogu [2]

7. 8. 21:26 | Honza Hučín

Cestou kolem blogu [1]

7. 8. 21:02 | Honza

Vrtulník nad hlavou [3]

6. 8. 14:29 | Pepa

Taková hra na volby [1]

3. 8. 18:29 | Honza

Nejčtenější

Žádné údaje nejsou k dispozici.

O mně

*1967, absolvent MFF UK v Praze (1991)

statistik, analytik, programátor, učitel, hudebník

nyní Ústav pro informace ve vzdělávání

Životopis (RTF)

Napište mi