Jeszcze wydajniejsze witryny internetowe Przyspieszanie dzialania serwisow WWW 3

background image

Jeszcze wydajniejsze witryny
internetowe. Przyspieszanie
dzia³ania serwisów WWW

Poznaj najlepsze techniki zwiêkszania wydajnoœci aplikacji internetowych!

• Jak stosowaæ technikê kodowania porcjami w celu szybszego kodowania stron?
• Jak pisaæ wydajny kod JavaScript?
• Jak rozdzielaæ zasoby na wiele domen?

Wydajnoœæ witryny stanowi jeden z podstawowych czynników jej sukcesu w sieci.
Jednak bogactwo treœci i popularnoœæ technologii Ajax w dzisiejszych aplikacjach
internetowych wystawiaj¹ przegl¹darki na ciê¿k¹ próbê. W tej sytuacji potrzebujesz
profesjonalnych informacji i skutecznych metod zwiêkszaj¹cych wydajnoœæ Twojej
strony WWW. Jeœli chcesz j¹ poprawiæ, powinieneœ skorzystaæ z tej ksi¹¿ki, poniewa¿
znajdziesz tu mnóstwo wartoœciowych technik, które pomog¹ Ci zoptymalizowaæ
dzia³anie ka¿dej aplikacji.

Ksi¹¿ka „Jeszcze wydajniejsze witryny internetowe. Przyspieszanie dzia³ania serwisów
WWW” zawiera najbardziej aktualne porady, dziêki którym Twoja witryna otrzyma
nowy zastrzyk energii. Z tego podrêcznika dowiesz siê, w jaki sposób Ajax wp³ywa na
interakcjê przegl¹darek i serwerów, oraz nauczysz siê wykorzystywaæ tê relacjê w celu
identyfikacji elementów s³u¿¹cych do poprawy wydajnoœci aplikacji. Poznasz metody
³¹czenia kodu osadzonego ze skryptami asynchronicznymi oraz kilka specyficznych
technik przyspieszania JavaScriptu. Dziêki tej ksi¹¿ce bêdziesz wiedzia³, jak zaoszczêdziæ
cenne sekundy przez skrócenie czasu wczytywania, a tak¿e sprawisz, ¿e Twoja witryna
bêdzie dzia³aæ jeszcze szybciej.

• Tworzenie responsywnych aplikacji WWW
• Wczytywanie skryptów bez blokowania
• £¹czenie skryptów asynchronicznych
• Pozycjonowanie skryptów osadzonych
• Pisanie wydajnego kodu JavaScript
• Skalowanie przy u¿yciu Comet
• Optymalizacja grafiki
• Rozdzielanie zasobów na wiele domen
• Upraszczanie selektorów CSS

Szybkoœæ ma znaczenie – zwiêksz wydajnoœæ swojej strony WWW

Autor:

Steve Souders

T³umaczenie: Leszek Sagalara
ISBN: 978-83-246-2579-6
Tytu³ orygina³u:

Even Faster Web Sites:

Performance Best Practices for Web Developers

Format: 168

×237, stron: 240

background image

3

Spis tre$ci

Wspó!autorzy ...........................................................................................................................9

Przedmowa ..............................................................................................................................11

Jak podzielona jest ksi%#ka?

11

Wydajno$/ JavaScriptu

13

Wydajno$/ sieci

14

Wydajno$/ przegl%darki

15

Konwencje zastosowane w ksi%#ce

15

U#ywanie przyk adowych kodów

16

Podzi&kowania

16

1. Wydajno$) technologii Ajax ........................................................................................ 19

Co$ za co$

19

Zasady optymalizacji

20

Ajax

22

Przegl%darka

22

Fajerwerki

23

JavaScript

24

Podsumowanie

24

2. Tworzenie responsywnych aplikacji WWW ...............................................................25

Co to znaczy „wystarczaj%co szybko”?

27

Pomiar opó'nienia

28

Gdy opó'nienia s% zbyt du#e

30

W%tkowanie

30

Zapewnienie responsywno$ci

31

Web Workers

31

Gears

32

Timery

33

Wp yw zu#ycia pami&ci na czas odpowiedzi

34

Pami&/ wirtualna

35

Rozwi%zywanie problemów zwi%zanych z pami&ci%

36

Podsumowanie

36

background image

4

!

Spis tre$ci

3. Rozdzielanie przesy!anej zawarto$ci .........................................................................39

Nie wszystko naraz

39

Oszcz&dno$ci z podzia u

40

Sposób podzia u

41

Niezdefiniowane symbole i sytuacje wy$cigu

42

Studium przypadku: Google Calendar

43

4. Wczytywanie skryptów bez blokowania ...................................................................45

Blokowanie skryptów

45

Techniki pobierania skryptów

47

XHR Eval

47

XHR Injection

48

Skrypt w IFrame

49

Skrypt w elemencie DOM

50

Skrypt odroczony

50

Znacznik SCRIPT w instrukcji document.write

50

Wska'niki zaj&to$ci przegl%darki

51

Zapewnianie (lub unikanie) wykonywania w kolejno$ci

53

Podsumowanie wyników

54

Zwyci&zc% zostaje…

55

5. 78czenie skryptów asynchronicznych ........................................................................59

Przyk ad kodu: menu.js

60

Sytuacja wy$cigu

62

Asynchroniczne zachowanie kolejno$ci

63

Technika 1.: Wywo anie zwrotne ustalone

64

Technika 2.: Window Onload

65

Technika 3.: Timer

66

Technika 4.: Script Onload

66

Technika 5.: Degraduj%ce znaczniki skryptu

67

Wiele skryptów zewn&trznych

69

Zarz%dzany kod XHR

70

Techniki skryptu w elemencie DOM i skryptu w instrukcji document.write

73

Ogólne rozwi%zanie

76

Pojedynczy skrypt

76

Wiele skryptów

77

Asynchroniczno$/ w praktyce

79

Google Analytics i Dojo

79

YUI Loader Utility

81

6. Pozycjonowanie skryptów osadzonych .....................................................................85

Blokuj%ce dzia anie skryptów osadzonych

85

Przeniesienie skryptów osadzonych na koniec dokumentu

86

Asynchroniczne inicjowanie wykonywania skryptów

87

U#ycie SCRIPT DEFER

88

Zachowywanie kolejno$ci wczytywania CSS i kodu JavaScript

89

background image

Spis tre$ci

!

5

Niebezpiecze(stwo: arkusz stylów przed skryptem osadzonym

90

Skrypty osadzone nie s% blokowane przez wi&kszo$/ pobiera(

90

Skrypty osadzone s% blokowane przez arkusze stylów

91

Takie rzeczy si& zdarzaj%

92

7. Pisanie wydajnego kodu JavaScript ............................................................................95

Zarz%dzanie zasi&giem

95

Stosowanie zmiennych lokalnych

97

Powi&kszanie a(cucha zasi&gu

98

Wydajny dost&p do danych

100

Sterowanie przep ywem

103

Szybkie warunkowanie

103

Szybkie p&tle

107

Optymalizacja a(cuchów znakowych

112

Konkatenacja a(cuchów

112

Przycinanie a(cuchów

114

Unikaj skryptów o d ugim czasie dzia ania

115

Wprowadzanie przerw przy u#yciu timerów

116

Wzorce timerów do wprowadzania przerw

118

Podsumowanie

120

8. Skalowanie przy u=yciu Comet ................................................................................. 123

Jak dzia a Comet?

123

Techniki transportowe

125

Odpytywanie

125

Wyd u#one odpytywanie

125

Wieczna ramka

127

Strumieniowanie XHR

128

Techniki transportowe przysz o$ci

130

Rozwi%zania mi&dzydomenowe

130

Efekty wdro#enia w aplikacjach

131

Zarz%dzanie po %czeniami

131

Pomiar wydajno$ci

132

Protoko y

132

Podsumowanie

133

9. Nie tylko gzip ............................................................................................................. 135

Dlaczego to ma znaczenie?

135

Co jest tego powodem?

137

Szybki przegl%d

137

Winowajca

137

Przyk ady popularnych #ó wich pods uchiwaczy

138

Jak pomóc tym u#ytkownikom?

138

Projektowanie pod k%tem zminimalizowania

rozmiarów nieskompresowanych danych

139

Edukowanie u#ytkowników

143

Bezpo$rednie wykrywanie obs ugi gzip

144

background image

6

!

Spis tre$ci

10. Optymalizacja grafiki ................................................................................................ 147

Dwa etapy upraszczaj%ce optymalizacj& grafiki

148

Formaty plików graficznych

149

Informacje wst&pne

149

Charakterystyka ró#nych formatów graficznych

151

Wi&cej o PNG

153

Automatyczna bezstratna optymalizacja grafiki

155

Optymalizacja plików PNG

155

Usuwanie metadanych JPEG

156

Konwersja plików GIF do formatu PNG

157

Optymalizacja animacji GIF

158

Smush.it

158

Progresywna wersja formatu JPEG dla du#ych grafik

158

Przezroczysto$/ stopniowana — unikaj AlphaImageLoader

159

Efekty przezroczysto$ci stopniowanej

159

AlphaImageLoader

161

Problemy zwi%zane z filtrem AlphaImageLoader

162

Progresywne rozszerzenie PNG8 o przezroczysto$/ stopniowan%

164

Optymalizacja

165

Podej$cie ca o$ciowe kontra podej$cie modu owe

166

Wysoce zoptymalizowane obrazy CSS Sprite

167

Inne optymalizacje grafiki

167

Unikaj skalowania grafiki

168

Optymalizuj grafiki generowane

168

Ikony favicon

169

Ikona Apple touch

170

Podsumowanie

171

11. Rozdzielanie zasobów na wiele domen ....................................................................173

Ycie#ka krytyczna

173

Kto rozdziela zasoby?

175

Przej$cie na HTTP/1.0

177

Rozdzielanie zasobów

179

Adres IP czy nazwa hosta?

179

Ile domen?

180

Jak podzieli/ zasoby?

180

Nowsze przegl%darki

180

12. Wcze$niejsze wysy!anie dokumentu .........................................................................181

Funkcja flush

181

Buforowanie danych wyj$ciowych

183

Kodowanie porcjami

185

Funkcja flush i kompresja gzip

186

Inne oprogramowanie po$rednicz%ce

186

Blokowanie domen przy u#ywaniu funkcji flush

187

Przegl%darki — ostatnia przeszkoda

188

Funkcja flush poza PHP

188

Lista kontrolna

189

background image

Spis tre$ci

!

7

13. OszczFdne wykorzystanie elementów IFrame .........................................................191

Najbardziej kosztowny element DOM

191

Elementy IFrame blokuj% zdarzenie onload

192

Równoleg e pobierania z elementami IFrame

194

Skrypt przed elementem IFrame

194

Arkusz stylów przed elementem IFrame

195

Arkusz stylów za elementem IFrame

196

Liczba po %cze( na serwer

197

Wspó dzielenie po %cze( w elementach IFrame

197

Wspó dzielenie po %cze( w kartach i oknach

198

Podsumowanie kosztu elementów IFrame

200

14. Upraszczanie selektorów CSS ................................................................................... 201

Rodzaje selektorów

201

Selektory identyfikatora

202

Selektory klas

202

Selektory typu

203

Selektory braci

203

Selektory dziecka

203

Selektory potomka

203

Selektory uniwersalne

203

Selektory atrybutu

204

Pseudoklasy i pseudoelementy

204

Klucz do tworzenia wydajnych selektorów CSS

204

Od prawej do lewej

204

Pisanie wydajnych selektorów CSS

205

Wydajno$/ selektorów CSS

206

Wp yw z o#onych selektorów na wydajno$/ (czasami)

206

Selektory CSS, których nale#y unika/

209

Czas dopasowywania

211

Pomiar selektorów CSS w praktyce

211

Dodatek A NarzFdzia do analizy i poprawy wydajno$ci .................................................... 213

Narz&dzia nas uchuj%ce

214

HttpWatch

214

Panel Sie/ dodatku Firebug

215

AOL Pagetest

215

VRTA

216

IBM Page Detailer

216

Panel Resources narz&dzia Web Inspector

216

Fiddler

216

Charles

217

Wireshark

217

Narz&dzia do analizy stron WWW

217

Firebug

217

Web Inspector

218

IE Developer Toolbar

219

background image

8

!

Spis tre$ci

Narz&dzia do analizy wydajno$ci

219

YSlow

220

AOL Pagetest

221

VRTA

223

neXpert

223

Ró#ne

224

Hammerhead

224

Smush.it

225

Cuzillion

226

UA Profiler

227

Skorowidz .............................................................................................................................229

background image

25

ROZDZIA7 2.

Tworzenie responsywnych

aplikacji WWW

Ben Galbraith i Dion Almaer

Technologia Ajax spowodowa a, #e wydajno$/ witryn internetowych przesta a by/ traktowana
tylko w kategoriach szybkiego wczytywania stron. Coraz wi&cej witryn korzysta z JavaScriptu,
aby po wczytaniu strony zmieni/ jej zawarto$/ i wprowadzi/ w locie now% tre$/. Tego rodzaju
witryny przypominaj% tradycyjne programy komputerowe, a optymalizacja ich wydajno$ci
wymaga u#ycia innego zestawu technik ni# w przypadku tradycyjnych witryn internetowych.

Interfejsy u#ytkownika aplikacji WWW i tradycyjnych programów komputerowych maj%
wspólny cel: odpowiedzie/ na dzia anie u#ytkownika tak szybko, jak to mo#liwe. W przy-
padku odpowiedzi na #%danie wczytania strony WWW wi&kszo$/ pracy zwi%zanej z respon-
sywno$ci% przejmuje sama przegl%darka. Otwiera ona po %czenie internetowe z wybran% wi-
tryn%, analizuje kod HTML, wysy a #%dania wczytania powi%zanych zasobów itd. W oparciu
o starann% analiz& tego procesu mo#emy tak zoptymalizowa/ nasze strony, aby by y szybciej
wy$wietlane, ale ostatecznie to przegl%darka sprawuje kontrol& nad ich wczytywaniem i wy-
$wietlaniem.

W przypadku dzia ania u#ytkownika dotycz%cego samej witryny (gdy nie powoduje ono
za adowania nowej strony przez przegl%dark&) mamy nad tym kontrol&. Musimy zapewni/
responsywno$/ kodu JavaScript wykonywanego w wyniku tego dzia ania. Aby lepiej zrozu-
mie/, w jakim stopniu mo#emy kontrolowa/ responsywno$/, niezb&dne b&dzie wyja$nienie
sposobu dzia ania interfejsu u#ytkownika w przegl%darce.

Jak wida/ na rysunku 2.1, gdy u#ytkownik pracuje z przegl%dark%, system operacyjny otrzymuje
sygna y wej$ciowe z ró#nych urz%dze( pod %czonych do komputera, takich jak klawiatura
lub mysz. System rozdziela te sygna y na aplikacje, do których powinny one trafi/, pakietuje
je jako pojedyncze zdarzenia i umieszcza w kolejce dla danej aplikacji, zwanej kolejkP zdarzeQ.

Przegl%darka internetowa, podobnie jak ka#da inna aplikacja GUI, przetwarza nast&pnie po-
szczególne zdarzenia umieszczone w swojej kolejce i na ich podstawie wykonuje na ogó jed-
n% z dwóch rzeczy: sama obs uguje dane zdarzenie (np. przez wy$wietlenie menu, przegl%-
danie WWW, wy$wietlenie okna preferencji itp.) lub wykonuje kod JavaScript znajduj%cy si&
na stronie (np. kod JavaScript zawieraj%cy procedur& obs ugi zdarzenia

onclick

), co przed-

stawia rysunek 2.2.

background image

26

!

Rozdzia! 2. Tworzenie responsywnych aplikacji WWW

Rysunek 2.1. System operacyjny kieruje wszystkie sygna'y wejAciowe u=ytkownika do kolejki zdarzeQ

Rysunek 2.2. PrzeglPdarka u=ywa pojedynczego wPtku do przetworzenia zdarzeQ z kolejki i wykonania
kodu u=ytkownika

Warto w tym miejscu wspomnie/, #e jest to proces w zasadzie jednow%tkowy, tzn. przegl%-
darka u#ywa jednego w%tku, aby pobra/ zdarzenie z kolejki, i albo robi co$ sama („Przegl%-
danie WWW” na rysunku 2.2), albo wykonuje kod JavaScript. Wskutek tego przegl%darka
mo#e wykona/ tylko jedno z tych zada( naraz, a ka#de z nich mo#e zapobiec wyst%pieniu
innego zdarzenia.

background image

Co to znaczy „wystarczaj8co szybko”?

!

27

Ka#da chwila sp&dzona przez przegl%dark& na wykonywaniu kodu JavaScript to okres, w ci%gu
którego nie mo#e ona odpowiada/ na inne zdarzenia u#ytkownika. Dlatego te# niezwykle
istotne jest, aby kod JavaScript umieszczony na stronie by wykonywany jak najszybciej. W prze-
ciwnym razie strona WWW i sama przegl%darka mog% reagowa/ z opó'nieniem lub ca kiem
zaprzesta/ dzia ania.

Trzeba tu zaznaczy/, #e ca y ten wyk ad o dzia aniu przegl%darki i systemu operacyjnego pod
wzgl&dem obs ugi sygna ów wej$ciowych i zdarze( jest tylko uogólnieniem obejmuj%cym
szeroki zakres przypadków, które w szczegó ach mog% si& ró#ni/. Jednak niezale#nie od ró#nic
wszystkie przegl%darki wykonuj% ca y kod JavaScript w jednym w%tku (chyba #e u#yjemy
Web Workers, co zostanie omówione w dalszej cz&$ci tego rozdzia u), co sprawia, #e z po-
wodzeniem mo#na zastosowa/ techniki zalecane w tym rozdziale.

Co to znaczy „wystarczaj8co szybko”?

^atwo powiedzie/, #e kod powinien by/ wykonywany „tak szybko, jak to mo#liwe”, ale cza-
sami trzeba przeprowadzi/ operacje, które zajmuj% troch& czasu. Algorytmy szyfruj%ce, z o#one
generowanie grafiki i operacje na obrazach — to przyk ady oblicze(, które s% czasoch onne
niezale#nie od tego, ile wysi ku w o#ymy w to, aby by y one „tak szybkie, jak to mo#liwe”.

Jednak#e, o czym wspomnia Douglas w rozdziale 1., programi$ci szukaj%cy sposobu na two-
rzenie responsywnych, wysoko wydajnych witryn internetowych nie mog% — i nie powinni
— d%#y/ do tego celu przez optymalizowanie ka#dego napisanego przez siebie fragmentu
kodu. Prawda wygl%da inaczej: nale#y optymalizowa/ tylko to, co nie dzia a wystarczaj%co
szybko.

Dlatego te# istotne jest zdefiniowanie, co jest „wystarczaj%co szybkie” w tym kontek$cie. Na
szcz&$cie kto$ ju# to za nas zrobi .

Jacob Nielsen, znany i powa#any ekspert w dziedzinie u#yteczno$ci aplikacji WWW, w po-
ni#szym cytacie

1

kwesti& „wystarczaj%cej szybko$ci” przedstawia nast&puj%co:

Wytyczne dotycz%ce czasu reakcji dla aplikacji WWW s% takie same jak dla wszystkich innych
aplikacji. Pozostaj% one niezmienne ju# od 37 lat i najprawdopodobniej nie zmieni% si& bez
wzgl&du na to, jaka technologia zostanie zaimplementowana w przysz o$ci.

0,1 sekundy

: Ograniczenie pozwalaj%ce u#ytkownikom odnie$/ wra#enie, #e bezpo$rednio

operuj% obiektami w graficznym interfejsie u#ytkownika. Dla przyk adu jest to czas od zazna-
czenia przez u#ytkownika kolumny w tabeli do pod$wietlenia kolumny lub zasygnalizowania
w inny sposób, #e zosta a ona wybrana. By oby idealnie, gdyby by to równie# czas reakcji na
sortowanie kolumny — w takim przypadku u#ytkownik mia by uczucie bezpo$redniego sor-
towania tabeli.

1 sekunda

: Ograniczenie pozwalaj%ce u#ytkownikom odnie$/ wra#enie swobodnej nawigacji

w przestrzeni polece( bez konieczno$ci nadmiernego oczekiwania na odpowied' komputera.
Opó'nienie od 0,2 do 1 sekundy oznacza, #e u#ytkownicy je zauwa#% i b&d% mie/ wra#enie, #e
komputer „pracuje” nad poleceniem, w przeciwie(stwie do sytuacji, gdy wykonanie polecenia
jest bezpo$rednim efektem dzia ania u#ytkownika. Przyk ad: je$li nie mo#na posortowa/ tabeli
zgodnie z wybran% kolumn% w czasie krótszym ni# 0,1 sekundy, trzeba to zrobi/ w ci%gu 1 se-
kundy, w przeciwnym razie u#ytkownicy odnios% wra#enie, #e interfejs dzia a oci&#ale, i strac%

1

http://www.useit.com/papers/responsetime.html

background image

28

!

Rozdzia! 2. Tworzenie responsywnych aplikacji WWW

poczucie p ynno$ci w wykonywaniu swojej pracy. W przypadku opó'nie( wi&kszych ni# 1 se-
kunda nale#y zasygnalizowa/ u#ytkownikowi, #e komputer pracuje nad problemem, np. przez
zmian& kszta tu kursora.

10 sekund

: Ograniczenie dla u#ytkowników skupiaj%cych sw% uwag& na zadaniu. Wszystko, co

trwa d u#ej ni# 10 sekund, wymaga procentowego wska'nika, a tak#e wyra'nie wskazanego
sposobu przerwania operacji. Trzeba za o#y/, #e wracaj%c do interfejsu po opó'nieniu d u#-
szym ni# 10 sekund, u#ytkownicy strac% p ynno$/ wykonywania zada( i b&d% musieli si&
„przestawi/”. Opó'nienia d u#sze ni# 10 sekund s% dopuszczalne tylko podczas naturalnych
przerw w pracy u#ytkownika, np. przy prze %czaniu zada(.

Innymi s owy, je$li wykonywanie Twojego kodu JavaScript trwa d u#ej ni# 0,1 sekundy,
Twoja strona nie wywo a wra#enia p ynno$ci i szybko$ci; je$li zajmie to d u#ej ni# 1 sekund&,
aplikacja b&dzie si& wydawa/ oci&#a a; przy opó'nieniu przekraczaj%cym 10 sekund u#yt-
kownik b&dzie ju# niezmiernie poirytowany. Takie s% ostateczne wskazówki, je$li chodzi o defini-
cj& „wystarczaj%cej szybko$ci”.

Pomiar opóOnienia

Skoro znasz ju# progi opó'nie(, nast&pnym etapem b&dzie poznanie sposobów pomiaru
szybko$ci wykonywania kodu JavaScript, co pozwoli okre$li/, czy nie przekracza ona wspo-
mnianych wcze$niej zakresów (sam musisz okre$li/, jak szybko ma dzia a/ Twoja strona; na-
szym celem jest utrzymanie wszystkich opó'nie( interfejsu poni#ej granicy 0,1 sekundy).

Naj atwiejszym, najprostszym i prawdopodobnie najmniej precyzyjnym sposobem pomiaru
opó'nienia jest obserwacja przez cz owieka; po prostu u#yj aplikacji na swojej docelowej
platformie i sprawd', czy ma wystarczaj%c% wydajno$/. W ko(cu zapewnienie odpowiedniej
wydajno$ci interfejsu ma s u#y/ cz owiekowi, wi&c jest to w a$ciwy sposób przeprowadzenia
takich pomiarów (oczywi$cie tylko nieliczni b&d% w stanie poda/ czas opó'nienia w sekundach
lub u amkach sekund; wi&kszo$/ pos u#y si& bardziej ogólnymi okre$leniami, np. „szybki”,
„powolny”, „zadowalaj%cy” itp.).

Je$li jednak pragniesz uzyska/ bardziej precyzyjne wyniki, masz dwie mo#liwo$ci: r&czne
(logowanie) lub zautomatyzowane (profilowanie) oprzyrz%dowanie kodu.

R&czne oprzyrz%dowanie kodu jest naprawd& proste. Powiedzmy, #e mamy na stronie funk-
cj& obs ugi zdarzenia, np.:

<div onclick="myJavaScriptFunction()"> ... </div>

Prostym sposobem dodania oprzyrz%dowania r&cznego b&dzie zlokalizowanie definicji funkcji

myJavaScriptFunction()

i dodanie do niej pomiaru czasu:

function myJavaScriptFunction() {
var start = new Date().getMilliseconds();
// tutaj jaki! skomplikowany kod
var stop = new Date().getMilliseconds();
var executionTime = stop - start;
alert("Wykonywanie funkcji myJavaScriptFunction() trwa!o " + executionTime + "
millisekund");
}

Powy#szy kod spowoduje otwarcie okna wy$wietlaj%cego czas wykonywania; milisekunda to

1

/

1000

sekundy, wi&c 100 milisekund odpowiada wspomnianemu wcze$niej progowi 0,1

sekundy.

background image

Pomiar opóOnienia

!

29

Wiele przegl%darek jest wyposa#onych we wbudowan% konsol& zapewniaj%c% funk-
cj& log() (Firefox udost&pnia j% w popularnym dodatku Firebug); osobi$cie bardziej
wolimy console.log() ni# alert().

Istniej% narz&dzia przeprowadzaj%ce automatyczny pomiar czasu wykonywania kodu, ale zazwy-
czaj stosuje si& je do innych celów. Zamiast do pomiaru dok adnego czasu wykonywania
funkcji narz&dzia takie — zwane profilerami — s% zwykle u#ywane do okre$lenia wzgl&dnej
ilo$ci czasu, jaki zajmuje wykonanie zestawu funkcji; inaczej mówi%c, s u#% one do wy-
krywania „w%skich garde ” lub wolniej wykonywanych fragmentów kodu.

Firebug (http://getfirebug.com/), popularny dodatek do przegl%darki Firefox, zawiera profiler kodu
JavaScript generuj%cy komunikaty wyj$ciowe podobne do przedstawionych na rysunku 2.3.

Rysunek 2.3. Profiler w dodatku Firebug

Kolumna Czas przedstawia czas, jaki interpreter JavaScriptu po$wi&ci ogó em na wykonanie
danej funkcji w okresie profilowania. Cz&sto zdarza si&, #e jaka$ funkcja wywo uje inne funk-
cje; kolumna W'asny czas przedstawia ilo$/ czasu po$wi&conego na wykonywanie tylko okre-
$lonej funkcji, bez innych funkcji, które mog y by/ wywo ywane.

Mo#na by s%dzi/, #e ta i inne kolumny podaj%ce czas przedstawiaj% precyzyjny pomiar czasu
wykonywania funkcji. Okazuje si& jednak, #e profilery wywo uj% co$ zbli#onego do efektu
obserwatora w fizyce: czynno$/ obserwacji dzia ania kodu wp ywa na dzia anie kodu.

Profilery mog% stosowa/ jedn% z dwóch strategii: albo b&d% ingerowa/ w kod b&d%cy przed-
miotem pomiarów przez dodanie specjalnego kodu zbieraj%cego statystyki wydajno$ci (chodzi
o proste zautomatyzowanie tworzenia kodu przedstawionego na poprzednim listingu), albo
pasywnie monitorowa/ czas uruchamiania, sprawdzaj%c, jaki fragment kodu wykonywany
jest w danym momencie. Ostatnie z tych dwóch podej$/ w mniejszym stopniu wp ywa na
wykonywanie profilowanego kodu, jednak odbywa si& to kosztem zebrania danych o ni#szej
jako$ci.

background image

30

!

Rozdzia! 2. Tworzenie responsywnych aplikacji WWW

W dodatku Firebug wyniki ulegaj% dalszym zniekszta ceniom, poniewa# jego profiler wywo uje
w asny proces wewn%trz procesu Firebuga, co obni#a wydajno$/ kodu b&d%cego przedmiotem
pomiarów.

Kolumna Procent w oknie dodatku Firebug pokazuje wzgl&dny czas wykonania: na interfejsie
swojej strony mo#esz przeprowadzi/ jakie$ wysokopoziomowe zadanie (np. klikn%/ przycisk
WyAlij

), a nast&pnie za pomoc% profilera dodatku Firebug sprawdzi/, które funkcje zabieraj%

najwi&cej czasu, i skupi/ swoje wysi ki na ich optymalizacji.

Gdy opóOnienia s8 zbyt du=e

Okazuje si&, #e gdy Twój kod JavaScript zatrzymuje w%tek przegl%darki na szczególnie d ugi
czas, wi&kszo$/ przegl%darek zainterweniuje i pozwoli u#ytkownikowi przerwa/ wykonywa-
nie kodu. Nie ma #adnego standardu mówi%cego o tym, w jaki sposób przegl%darki maj% okre-
$la/, czy da/ u#ytkownikowi tak% mo#liwo$/ (szczegó owe informacje dotycz%ce zachowania po-
szczególnych przegl%darek znajduj% si& na stronie http://www.nczonline.net/blog/2009/01/05/
what-determines-that-a-script-is-long-running/

).

Wniosek jest prosty: nie wprowadzaj na swoj% stron& WWW 'le napisanego kodu, którego
wykonywanie mo#e trwa/ potencjalnie bardzo d ugo.

W8tkowanie

Po zidentyfikowaniu kodu, który zachowuje si& nieodpowiednio, nast&pnym etapem b&dzie
jego optymalizacja. Czasem jednak zadanie wykonywane przez taki kod mo#e wi%za/ si&
z du#ym kosztem i nie da si& go w magiczny sposób zoptymalizowa/ w celu jego przyspie-
szenia. Czy taki scenariusz musi si& wi%za/ ze spowolnieniem dzia ania interfejsu? Czy nie
ma #adnego sposobu, aby zadowoli/ naszych u#ytkowników?

Tradycyjnym rozwi%zaniem w takich przypadkach jest skorzystanie z w'tków, aby odci%#y/
w%tek u#ywany do interakcji z u#ytkownikiem od wykonywania kodu powoduj%cego du#y
koszt. W naszym scenariuszu umo#liwi to przegl%darce kontynuowanie przetwarzania zda-
rze( z kolejki i zachowanie responsywno$ci interfejsu, podczas gdy d ugo dzia aj%cy kod b&dzie
wykonywany w innym w%tku (a system operacyjny zatroszczy si& o to, aby zarówno w%tek
interfejsu u#ytkownika przegl%darki, jak i w%tek wykonywany w tle sprawiedliwie korzy-
sta y z zasobów komputera).

JavaScript nie zawiera jednak obs ugi w%tków, dlatego w przypadku kodu JavaScript nie ma
mo#liwo$ci utworzenia w%tku wykonuj%cego w tle kod o du#ym koszcie. Co wi&cej, nie wy-
gl%da na to, aby ta sytuacja mia a ulec zmianie.

Brendan Eich, twórca JavaScriptu i dyrektor techniczny fundacji Mozilla, wyrazi si& do$/ jasno
w tej kwestii

2

:

qeby pracowa/ z systemami w%tkowania, musisz by/ [wielki jak gracz NBA], a to oznacza, #e
wi&kszo$/ programistów powinna uciec z p aczem. Ale tak nie zrobi%. Zamiast tego, podobnie
jak to jest w przypadku wi&kszo$ci innych ostrych narz&dzi, b&dzie ich kusi/, #eby pokaza/, jacy

2

http://weblogs.mozillazine.org/roadmap/archives/2007/02/threads_suck.html

background image

Zapewnienie responsywno$ci

!

31

s% wielcy. Wezm% najbli#szy jednow%tkowy kod i wepchn% go w $rodowisko wielow%tkowe

lub w inny sposób doprowadz% do sytuacji wy$cigu. Sporadycznie efekty b&d% tragiczne, ale zbyt
cz&sto sko(czy si& to tak, #e mimo pokaleczenia sobie palców nikt nie wyniesie z tego nauki.

W%tki wprowadzaj% ca y szereg zak óce(, g ównie przez tworzenie sytuacji wy$cigu, ryzyko

zakleszczenia i pesymistyczn% blokad& obci%#enia. I wci%# nie s% na tyle skalowalne, aby mog y
w przysz o$ci obs u#y/ te wszystkie megardzenie i teraflopy.

Dlatego moja standardowa odpowied' na takie pytania, jak: „Kiedy dodasz w%tki do Java-
Scriptu?”, brzmi: „Po twoim trupie!”.

Bior%c pod uwag& wp yw Brendana na bran#& i na przysz o$/ JavaScriptu (który jest znaczny)
oraz fakt, #e wiele osób w du#ym stopniu podziela jego pogl%dy, mo#na bezpiecznie przyj%/,
#e w JavaScripcie niepr&dko pojawi% si& w%tki.

Istniej% jednak inne rozwi%zania. Podstawowy problem z w%tkami polega na tym, #e ró#ne
w%tki mog% mie/ dost&p do tych samych zmiennych i mog% je modyfikowa/. To powoduje
ca y szereg problemów, np. gdy w%tek A modyfikuje zmienne, które s% aktywnie modyfiko-
wane przez w%tek B itp. Mo#na by s%dzi/, #e przyzwoity programista poradzi sobie z tego
rodzaju kwestiami, ale jak si& okazuje, Brendan twierdzi, #e nawet najlepsi z nas pope niaj%
okropne pomy ki w tej dziedzinie.

Zapewnienie responsywno$ci

To, czego potrzebujemy, to odnoszenie korzy$ci z w%tków — równoleg ego wykonywania
zada( — bez ryzyka, #e b&d% one sobie nawzajem wchodzi/ w parad&. Firma Google w swoim
popularnym dodatku do przegl%darek o nazwie Gears zaimplementowa a w a$nie takie API:
WorkerPool. W zasadzie umo#liwia ono g ównemu w%tkowi JavaScript przegl%darki two-
rzenie dzia aj%cych w tle w%tków roboczych (ang. workers), które rozpoczynaj%c prac&, otrzy-
muj% pewne proste komunikaty (np. stan autonomiczny, bez odniesie( do wspólnych zmien-
nych) z w%tku przegl%darki i zwracaj% komunikat po jej zako(czeniu.

Do$wiadczenia z dzia ania tego API w dodatku Gears sprawi y, #e w wielu przegl%darkach
(np. Safari 4, Firefox 3.1

3

) wprowadzono bezpo$redni% obs ug& w%tków roboczych w oparciu

o wspólne API zdefiniowane w specyfikacji HTML 5. Opcja ta jest znana pod nazw% Web
Workers.

Web Workers

Rozwa#my, w jaki sposób wykorzysta/ API Web Workers do odszyfrowania warto$ci. Poni#szy
listing przedstawia sposób tworzenia i zainicjowania w%tku roboczego:

// utworzenie i rozpocz"cie wykonywania w#tku roboczego
var worker = new Worker("js/decrypt.js");
// zarejestrowanie procedury obs$ugi zdarzenia, która zostanie wykonana,
// gdy w#tek roboczy wy!le komunikat do w#tku g$ównego
worker.onmessage = function(e) {
alert("Odszyfrowana warto"= to " + e.data);
}
// wys$anie komunikatu do w#tku roboczego, w tym przypadku b"dzie to warto!% do odszyfrowania
worker.postMessage(getValueToDecrypt());

3

Przegl%darka Firefox nosi a numer 3.1 w wersji beta, ostatecznie jednak zosta a wydana jako Firefox 3.5 —

przyp. t'um.

background image

32

!

Rozdzia! 2. Tworzenie responsywnych aplikacji WWW

Przyjrzyjmy si& teraz hipotetycznej zawarto$ci skryptu js/decrypt.js:

// zarejestrowanie funkcji obs$ugi komunikatów przekazywanych przez w#tek g$ówny
onmessage = function(e) {
// pobranie otrzymanych danych
var valueToDecrypt = e.data;

// Do zrobienia: zaimplementowa% w tym miejscu funkcj" deszyfruj#c#

// zwrócenie warto!ci do w#tku g$ównego
postMessage(decryptedValue);
}

Wszystkie potencjalnie kosztowne (tj. o d ugim czasie dzia ania) operacje JavaScriptu wyko-
nywane przez Twoj% stron& powinny by/ przekazywane do w%tków roboczych. Dzi&ki temu
Twoja aplikacja b&dzie dzia a/ z pe n% szybko$ci%.

Gears

Je$li znajdziesz si& w sytuacji, #e Twoja aplikacja ma dzia a/ w przegl%darce, która nie obs uguje
API Web Workers, istnieje kilka innych rozwi%za(. W poprzednim rozdziale wspomnieli$my
o dodatku Gears firmy Google; dzi&ki niemu mo#na uzyska/ co$ bardzo podobnego do Web
Workers w przegl%darce Internet Explorer, w starszych wersjach Firefoksa i starszych wer-
sjach Safari.

API w%tków roboczych w Gears jest podobne do API Web Workers, cho/ nie identyczne. Poni#ej
przedstawione zosta y dwa poprzednie listingi z kodem skonwertowanym na API Gears, po-
cz%wszy od kodu wykonywanego w g ównym w%tku w celu zainicjowania w%tku roboczego:

// utworzenie puli w#tków, która zainicjuje w#tki robocze
var workerPool = google.gears.factory.create('beta.workerpool');

// zarejestrowanie funkcji obs$ugi zdarze&, która b"dzie odbiera% komunikaty z w#tków roboczych
workerPool.onmessage = function(ignore1, ignore2, e) {
alert("Odszyfrowana warto"= to + " e.body);
}

// utworzenie w#tku roboczego
var workerId = workerPool.createWorkerFromUrl("js/decrypt.js");

// wys$anie komunikatu do w#tku roboczego
workerPool.sendMessage(getValueToDecrypt(), workerId);

A tak wygl%da zawarto$/ skryptu js/decrypt.js w wersji Gears:

var workerPool = google.gears.workerPool;
workerPool.onmessage = function(ignore1, ignore2, e) {
// pobranie przys$anych danych
var valueToDecrypt = e.body;

// Do zrobienia: zaimplementowa% w tym miejscu funkcj" deszyfruj#c#

// zwrócenie warto!ci do w#tku g$ównego
workerPool.sendMessage(decryptedValue, e.sender);
}

background image

Zapewnienie responsywno$ci

!

33

WiFcej na temat Gears

Warto pozna/ kilka faktów z historii powstania w%tków roboczych Gears, poniewa# zosta y

one wymy$lone z bardzo praktycznych wzgl&dów. Dodatek Gears zosta utworzony przez
zespó Google, który stara si& zmusi/ przegl%dark& do wykonywania zada(, jakich nie by a
wtedy w stanie wykona/ (dzia o si& to przed powstaniem Google Chrome — ale nawet
maj%c Chrome, Google chce, aby mo#liwie jak najwi&ksza liczba u#ytkowników mog a wy-

konywa/ z o#one zadania za pomoc% ich aplikacji WWW).
Wyobra' sobie, #e chcia by$ zbudowa/ Gmail Offline — czego by/ potrzebowa ? Po pierw-

sze, musia by$ znale'/ sposób na lokalne buforowanie dokumentów i ich przechwytywanie,
aby — gdy przegl%darka spróbuje uzyska/ dost&p do strony http://mail.google.com/ — wy-
$wietli a si& #%dana strona, a nie komunikat o braku po %czenia. Po drugie, wymaga oby to

jakiej$ metody przechowywania wiadomo$ci e-mail, zarówno tych nowych, jak i starych.
Mo#na by to zrobi/ na wiele sposobów, ale skoro dobrze znany SQLite jest obecny w wi&k-
szo$ci nowych przegl%darek i do %czany do wielu systemów operacyjnych, dlaczego tego

nie wykorzysta/? Tutaj w a$nie tkwi problem.
Omawiali$my kwestie zwi%zane z jednow%tkow% przegl%dark%. Wyobra' sobie teraz takie

operacje, jak zapisywanie nowych wiadomo$ci e-mail do bazy danych lub wykonywanie
d ugich zapyta(. Mo#emy zablokowa/ interfejs u#ytkownika w czasie, gdy baza danych
wykonuje swoj% prac& — opó'nienia mog% by/ ogromne! Zespó pracuj%cy nad Gears

musia sobie jako$ z tym poradzi/. Dodatek Gears mo#e robi/, co chce, wi&c z atwo$ci%
mo#na by o obej$/ brak w%tków w JavaScripcie. Skoro jednak wspó bie#no$/ stanowi ogól-
ny problem, czemu nie udost&pni/ tej mo#liwo$ci na zewn%trz? Tak powsta o API Worker-
Pool, które doprowadzi o do powstania Web Workers w standardzie HTML 5.
Te dwa API ró#ni% si& nieznacznie, ale wynika to st%d, #e Web Workers jest czym$ w rodzaju
wersji 2.0 pionierskiego API Gears; niebawem Gears powinien zosta/ wyposa#ony w obs u-

g& standardowego API. Powsta y ju# biblioteki po$rednicz%ce, b&d%ce czym$ w rodzaju
pomostu mi&dzy istniej%cym API Gears a standardowym API Web Workers, których mo#na
u#ywa/ nawet bez Gears lub Web Workers (stosuj%c

setTimeout()

, co zostanie omówione

w dalszej cz&$ci tego rozdzia u).

Timery

Inne podej$cie, popularne przed powstaniem Gears i Web Workers, polega o na podzieleniu
d ugotrwa ych operacji na mniejsze cz&$ci i kontrolowaniu ich dzia ania przy u#yciu timerów
JavaScriptu. Np.:

var functionState = {};

function expensiveOperation() {
var startTime = new Date().getMilliseconds();
while ((new Date().getMilliseconds() - startTime) < 100) {
// Do zrobienia: zaimplementowa% d$ugotrwa$# operacj" w taki sposób,
// aby ca$a praca by$a wykonywana w mniejszych fragmentach,
// trwaj#cych krócej ni' 100 ms, z przekazywaniem stanu do "functionState"
// poza t# funkcj#; powodzenia ;-)
}

if (!functionState.isFinished) {
// ponownie wprowadzi% d$ugotrwa$# operacj" 10 ms po wyj!ciu;
// warto poeksperymentowa% z wi"kszymi warto!ciami, aby zachowa%
// w$a!ciwe proporcje mi"dzy responsywno!ci# a wydajno!ci#

background image

34

!

Rozdzia! 2. Tworzenie responsywnych aplikacji WWW

setTimeout(expensiveOperation(), 10);
}
}

Dziel%c operacj& w przedstawiony sposób, zachowamy responsywno$/ interfejsu, ale — jak
wskazuje komentarz w listingu — skonstruowanie takiej operacji mo#e by/ trudne (a nawet
niewykonalne). Wi&cej informacji na temat takiego u#ycia metody

setTimeout()

zawiera

punkt „Wprowadzanie przerw przy u#yciu timerów” na stronie 116.

Z podej$ciem tym wi%#e si& inna podstawowa kwestia. Wi&kszo$/ nowoczesnych kompute-
rów wyposa#ona jest w procesory o kilku rdzeniach, co oznacza, #e mog% pracowa/ napraw-
d& wielow%tkowo (podczas gdy wcze$niejsze procesory jedynie emulowa y wielow%tkowo$/
przez szybkie prze %czanie si& mi&dzy zadaniami). R&czne prze %czanie zada( zaimplemen-
towane za pomoc% Javascriptu, jakie mia o miejsce w przedstawionym listingu, nie mo#e
wykorzystywa/ takich architektur; a wi&c nie u#yjemy ca ej mocy procesora, zmuszaj%c jeden
z rdzeni do wykonania ca ej pracy.

A zatem mo#liwe jest przeprowadzanie d ugotrwa ych operacji w g ównym w%tku przegl%-
darki i zachowanie responsywno$ci interfejsu, ale atwiejsze i wydajniejsze b&dzie u#ycie
w%tków roboczych.

XMLHttpRequest

Ca a ta dyskusja na temat w%tkowania nie by aby kompletna, gdyby$my nie wspomnieli
o

XMLHttpRequest

(w skrócie XHR), który umo#liwi rewolucj&, jak% by Ajax. U#ywaj%c

XHR, strona WWW mo#e wys a/ komunikat i otrzyma/ odpowied' w ca o$ci w $rodowisku
JavaScript, co pozwala uzyska/ z o#on% interaktywno$/ bez konieczno$ci wczytywania
nowych stron.
XHR ma dwa proste tryby dzia ania: synchroniczny i asynchroniczny. W trybie asynchro-
nicznym XHR jest w zasadzie w%tkiem Web Worker, tyle #e posiada wyspecjalizowane API;
w istocie w po %czeniu z innymi funkcjami powstaj%cej specyfikacji HTML 5 mo#na odtwo-
rzy/ dzia anie XHR za pomoc% w%tków roboczych. W trybie synchronicznym XHR dzia a w taki
sposób, #e ca % sw% prac& wykonuje w g ównym w%tku przegl%darki, co sprawia, #e opó'-
nienia w interfejsie u#ytkownika trwaj% tyle czasu, ile potrzeba XHR na wys anie jego #%da-
nia i przeanalizowanie odpowiedzi z serwera. Dlatego te# nigdy nie u#ywaj XHR w trybie
synchronicznym, gdy# mo#e to doprowadzi/ do nieprzewidzianych opó'nie( w funkcjo-
nowaniu interfejsu u#ytkownika, znacznie wykraczaj%cych poza dopuszczalne granice.

Wp!yw zu=ycia pamiFci na czas odpowiedzi

W tworzeniu responsywnych stron WWW wyst&puje jeszcze inny kluczowy aspekt: zarz%-
dzanie pami&ci%. Podobnie jak w wielu nowoczesnych j&zykach wysokiego poziomu, które
zawieraj% elementy niskopoziomowego zarz%dzania pami&ci%, tak i w wi&kszo$ci $rodowisk
uruchomieniowych JavaScriptu wyst&puje mechanizm automatycznego oczyszczania pami&ci
(ang. garbage collection, w skrócie GC). Mo#e to by/ cudowne rozwi%zanie, uwalniaj%ce programi-
stów od nu#%cych detali kojarz%cych si& bardziej z ksi&gowo$ci% ni# z programowaniem.

Automatyczne zarz%dzanie pami&ci% wi%#e si& jednak z pewnym kosztem. Wszystkie z wyj%t-
kiem najbardziej wyrafinowanych implementacji GC „zatrzymuj% ca y $wiat”, przeprowa-
dzaj%c oczyszczanie pami&ci, tzn. „zamra#aj%” ca e $rodowisko (w %cznie z tym, co nazwali$my

background image

Zapewnienie responsywno$ci

!

35

g ównym w%tkiem JavaScript przegl%darki), podczas gdy same wykonuj% ca % mas& czynno-
$ci zwi%zanych z tworzeniem obiektów oraz wyszukiwaniem tych, które nie s% ju# u#ywane
i które mo#na zutylizowa/ do nieu#ywanych obszarów pami&ci.

W przypadku wi&kszo$ci aplikacji proces GC jest ca kowicie przezroczysty; okresy zabloko-
wania $rodowiska uruchomieniowego s% na tyle krótkie, #e ca kowicie umyka to uwadze u#yt-
kownika. Jednak w miar& zajmowania przez aplikacj& coraz wi&kszych obszarów pami&ci wyd u-
#a si& czas niezb&dny do wyszukania nieu#ywanych obiektów i ostatecznie mo#e osi%gn%/
poziom, który b&dzie zauwa#alny dla u#ytkownika.

Gdy to nast%pi, aplikacja w do$/ regularnych odst&pach czasu b&dzie dzia a/ mniej lub bar-
dziej oci&#ale; w miar& narastania problemu mo#e doj$/ nawet do zablokowania przegl%darki.
Oba te efekty mog% doprowadzi/ u#ytkownika do frustracji.

Wi&kszo$/ nowoczesnych platform dostarcza wyrafinowanych narz&dzi umo#liwiaj%cych
monitorowanie wydajno$ci procesu GC w $rodowisku uruchomieniowym i podgl%d bie#%cego
zestawu analizowanych obiektów w celu zdiagnozowania problemów zwi%zanych z oczysz-
czaniem pami&ci. Niestety, $rodowiska uruchomieniowe JavaScriptu nie mieszcz% si& w tej
kategorii. Co gorsza, nie istniej% #adne narz&dzia, które mog yby poinformowa/ programist&
o tym, kiedy nast&puje oczyszczanie pami&ci lub ile czasu trwa jego przeprowadzenie. Wykorzy-
stuj%c je, mo#na by sprawdzi/, czy zaobserwowane opó'nienia maj% zwi%zek z procesem
oczyszczania pami&ci.

Brak takich narz&dzi jest powa#n% niedogodno$ci% dla twórców z o#onych aplikacji Java-
Script dzia aj%cych w oparciu o przegl%darki. Na razie programi$ci mog% jedynie zgadywa/,
czy za opó'nienia interfejsu u#ytkownika odpowiada mechanizm automatycznego oczyszcza-
nia pami&ci.

PamiF) wirtualna

Istnieje jeszcze inne niebezpiecze(stwo zwi%zane z pami&ci%: stronicowanie. W systemach
operacyjnych mamy dwa rodzaje pami&ci udost&pnianej aplikacjom: fizyczna i wirtualna.
Pami*+ fizyczna

to niezwykle szybkie modu y RAM zamontowane w komputerze; pami*+

wirtualna

znajduje si& na znacznie wolniejszych urz%dzeniach pami&ci masowej (np. na dysku

twardym), które swoj% stosunkow% powolno$/ nadrabiaj% znacznie wi&ksz% dost&pn% prze-
strzeni% pami&ci.

Je$li wymagania pami&ciowe Twojej strony WWW wzrosn% w znacznym stopniu, system
operacyjny mo#e by/ zmuszony do rozpocz&cia stronicowania, niezwykle powolnego proce-
su, przez co inne procesy b&d% musia y zwolni/ zajmowan% przez siebie pami&/ fizyczn%, aby
udost&pni/ miejsce na rosn%cy apetyt przegl%darki. Proces ten nazywa si& stronicowaniem,
poniewa# wszystkie nowoczesne systemy operacyjne dziel% pami&/ na pojedyncze strony, tj.
najmniejsze jednostki pami&ci, które s% odwzorowywane do pami&ci fizycznej lub wirtualnej.
W trakcie stronicowania strony te s% przenoszone z pami&ci fizycznej do pami&ci wirtualnej
(tj. z pami&ci RAM na dysk twardy) lub odwrotnie.

Spadek wydajno$ci spowodowany stronicowaniem ró#ni si& od przerw wywo ywanych pro-
cesem oczyszczania pami&ci; stronicowanie powoduje ogólne, wszechobecne spowolnienie,
natomiast opó'nienia w procesie GC przejawiaj% si& zwykle w formie dyskretnych, pojedyn-
czych przerw wyst&puj%cych w okre$lonych przedzia ach czasowych — cho/ d ugo$/ tych

background image

36

!

Rozdzia! 2. Tworzenie responsywnych aplikacji WWW

przerw ro$nie wraz z up ywem czasu. Niezale#nie od tych ró#nic ka#dy z tych problemów sta-
nowi znacz%ce zagro#enie dla osi%gni&cia Twojego celu, jakim jest utworzenie responsywnego
interfejsu u#ytkownika.

Rozwi8zywanie problemów zwi8zanych z pamiFci8

Jak wspomnieli$my wcze$niej, nie znamy #adnych dobrych narz&dzi do diagnostyki pami&ci
przeznaczonych dla aplikacji JavaScript uruchamianych w przegl%darce. Póki co nale#y ob-
serwowa/ zaj&to$/ pami&ci procesu przegl%darki (szczegó owe informacje na temat pomiaru
zaj&to$ci pami&ci przez procesy w systemach Windows i OS X zawiera sekcja „Measuring
Memory Use” pod adresem http://blog.pavlov.net/2008/03/11/firefox-3-memory-usage/). Je$li pod-
czas dzia ania aplikacji zaj&to$/ pami&ci wzrasta znacznie powy#ej akceptowanych warto$ci,
sprawd', czy w kodzie Twojej aplikacji s% jakie$ mo#liwo$ci optymalizacji zu#ycia pami&ci.

Je$li oka#e si&, #e masz problem zwi%zany z pami&ci%, powiniene$ poszuka/ mo#liwo$ci jej
oczyszczenia, je$li jeszcze tego nie zrobi e$. Mo#esz to zrobi/ przez:

u#ycie s owa kluczowego

delete

w celu usuni&cia z pami&ci zb&dnych obiektów JavaScript,

usuni&cie zb&dnych w&z ów z modelu DOM strony WWW.

Poni#szy listing przedstawia sposób przeprowadzenia obu tych zada(:

var page = { address: "http://jakis/adres/url" };

page.contents = getContents(page.address);

...

// pó*niej zawarto!% nie b"dzie ju' d$u'ej potrzebna
delete page.contents;

...

var nodeToDelete = document.getElementById("redundant");

// usuniecie w"z$a z modelu DOM (co mo'na zrobi% jedynie
// przez wywo$anie do removeChild() z w"z$a nadrz"dnego)
// i równoczesne usuni"cie w"z$a z pami"ci
delete nodeToDelete.parent.removeChild(nodeToDelete);

Oczywi$cie jest jeszcze wiele mo#liwo$ci ulepsze( w zakresie optymalizacji zu#ycia pami&ci przez
strony WWW. W fundacji Mozilla zajmujemy si& obecnie tworzeniem narz&dzi przeznaczonych
do rozwi%zywania tego rodzaju problemów. W chwili gdy czytasz t& ksi%#k&, co najmniej jedno
z takich narz&dzi powinno by/ ju# dost&pne pod adresem http://labs.mozilla.com.

Podsumowanie

Ajax zapocz%tkowa now% er& stron WWW dzia aj%cych w oparciu o JavaScript. S% one w rze-
czywisto$ci aplikacjami dzia aj%cymi w przegl%darce i je$li chodzi o interfejs u#ytkownika, pod-
legaj% takim samym wymogom jak ka#da inna aplikacja. Istotne jest to, aby zapewnia y one
responsywno$/ interfejsu przez zminimalizowanie operacji wykonywanych w g ównym
w%tku aplikacji.

background image

Podsumowanie

!

37

Web Workers to pot&#ne nowe narz&dzie, które mo#na wykorzysta/ do przerzucenia skom-
plikowanych operacji zagra#aj%cych responsywno$ci interfejsu u#ytkownika. Je$li nie mo#na
u#y/ Web Workers, mo#emy wykorzysta/ dodatek Gears i timery JavaScriptu.

Z e zarz%dzanie pami&ci% mo#e doprowadzi/ do powstania problemów zwi%zanych z wy-
dajno$ci% interfejsu u#ytkownika. Mimo braku dobrych narz&dzi do rozwi%zywania proble-
mów z pami&ci% programi$ci mog% obserwowa/ wykorzystanie pami&ci przez przegl%dark&
i w razie wyst%pienia problemów podj%/ odpowiednie kroki w celu zminimalizowania zaj&-
to$ci pami&ci przez aplikacj&. Dobra wiadomo$/ jest taka, #e trwaj% ju# prace nad utworzeniem
narz&dzi do rozwi%zywania problemów z pami&ci%.


Wyszukiwarka

Podobne podstrony:
informatyka jeszcze wydajniejsze witryny internetowe przyspieszanie dzialania serwisow www steve sou
Wydajne witryny internetowe Przyspieszanie dzialania serwisow WWW 2
informatyka wydajne witryny internetowe przyspieszanie dzialania serwisow www steve souders ebook
INTERNET Tworzenie serwisów WWW Dźwięk
teksty z serwisow www prezentacje org
Kupuj jeszcze taniej przez Internet, pliki zamawiane, edukacja
Witryna w Internecie – zasady tworzenia i funkcjonowania odpowiedzi na0
INTERNA Pytania działami

więcej podobnych podstron