ugrás a tartalomhoz

AJAX fejlesztés - tapasztalatok

Bártházi András · 2006. Május. 20. (Szo), 12.37

AJAX fejlesztés

Az utóbbi időben lehetőségem volt egy elég összetett, "igazi" AJAX-os webalkalmazás kifejlesztésére. Az alkalmazás jelentős mennyiségű adat (akár 700 adatcsomag) letöltése után az adatok különböző szempontok szerinti szűrését, rendezését és csoportosítását teszi lehetővé. Az ezzel az alkalmazással kapcsolatos tapasztalatokról szeretnék megejteni két-három blogbejegyzést a jövőben, egyrészt megosztva a tapasztalatokat, másrészt pedig megvitatva a döntéseimet - hátha tudtok jobbat. Mindenekelőtt egy kicsit a buktatókról.

A buktatót úgy hívják, hogy Internet Explorer. Elkövettem azt a hibát, hogy a CSS+XHTML oldalkialakítás során már bevált sorrendet alkalmaztam, és az Explorert a fejlesztés végére hagytam. Míg egy CSS alapú oldalkialakításnál, ha Firefoxot használok a fejlesztés alatt, akkor az Internet Explorerre illesztés a végén a munkának az 5%-át jelenti (nem túl jelentős rész) -, addig az AJAX fejlesztés során összemérhető időt vehet el az optimalizálás, nem csak a munka nagysága, de az igazán jó eszközök hiánya miatt is.

Az alkalmazás egyik követelménye az volt, hogy elviselhető mértékben használja ki a gép processzorát. A program nagy része már elkészült, amikor kiderült, hogy az addig Firefoxban kiválóan működő programmal Internet Explorer alatt jelentős teljesítmény problémák vannak. Az adatok szerverről letöltése és előfeldolgozása 100%-ra vitte fel a processzorhasználatot, és ott is tartotta úgy, hogy közben a böngésző gyakorlatilag használhatatlanná vált. Be kellett látnom, hogy az Explorer JavaScriptje sok esetben jóval lassabb és processzor igényesebb, mint a Firefoxé.

Az alkalmazás logikája szerint az adatokat bizonyos szempontok szerint a letöltés közben rendezni kell, és folyamatosan megjeleníteni a legjobb 10 találatot. A rendezéshez egy saját egyszerű rendezési algoritmust írtam (talán sima buborékrendezés volt), ami párszáz elemű tömbnél IE alatt már elviselhetetlenül lassúnak bizonyult. A JavaScriptnek van viszont egy beépített rendezési lehetősége, ami elég jól paraméterezhető: megadható neki egy függvény, ami a rendezés során az összehasonlításokat végzi. Az erre való áttérés egy nagyságrendet gyorsított, de még így is lassú volt a rendezés egy adott adatmennyiség felett. A megoldást végül az jelentette, hogy mindig csak a legjobb 10 és az éppen letöltött adatok kerülnek rendezésre, a kalapban mindig csak a legjobb 10-et bennhagyva végül. Ezen kívül a rendezési függvényt is minimálisra kellett leszorítani, hiszen nagyon sokszor került meghívásra.

Az AJAX fejlesztés / webalkalmazás fejlesztés során az egyes számú tanulság számomra tehát az volt, hogy nagyobb adatmennyiségek használatakor oda kell rá figyelni, hogy mit és hogyan csinálunk, s a jó és hatékony működéshez bizony különböző trükköket is be kell vetni.
 
1

"Belső rendezés"

Jano · 2006. Május. 20. (Szo), 13.45
A rendezés abszolút "belső" volt, vagyis nem történt közben kiiratás? Az adatok mennyire voltak bonyolultak, összetettek?
2

Rendezés

Bártházi András · 2006. Május. 20. (Szo), 13.50
A rendezés közben nem történt kiiratás, utána igen. Úgy működik a dolog, hogy lejön jellemzően 10 adatcsomag, majd a találatok listáját frissíteni kell a legjobb 10-et megjelenítve. Egy adatcsomag viszonylag nagynak mondható, olyan 50-100 tulajdonsággal bíró objektumról van szó.
3

TrimQuery

toxin · 2006. Május. 20. (Szo), 14.34
csak úgy eszembe jutott a problémáról:

TrimQuery-t néztétek most, vagy valaha is, van vele kapcsolatban vkinek pozitív-negatív tapasztalata ?

http://trimpath.com/project/wiki/TrimQuery
4

Jó lenne

zottty · 2006. Május. 20. (Szo), 21.47
Cool! Várom a bejegyzéseket!!
5

quick sort

Hodicska Gergely · 2006. Május. 20. (Szo), 22.44
Ajánlom Neked a fenti algoritmus bevetését. Biztosan találsz kész JS megvalósítást is, de megírni sem akkora ördöngősség. A buborék rendezés időigénye O(n^2), míg a quick sorté O(n*lg(n)), a különbség drasztikus n növekedtével.


Felhő
6

array.sort

Jano · 2006. Május. 20. (Szo), 23.25
A beépített array.sort()-ot használta, az tuti QuickSort-os.
9

Ha nem is...

Anonymous · 2006. Május. 21. (V), 00.33
Ha nem is az, már eleve az az előnye megvan, hogy natív kód, nem kell átmenni az interpreteren.

Volt már nem egyszer olyan, hogy önmagában relative gyors, de rengetegszer végrehajtott művelet elfogadhatatlanná tette a futásidőt annak ellenére, hogy CLI szkript volt. Elkezdtem keresgélni a php manualban, találtam rá függvényt. Kb 1/8. annyi időbe telt.
7

Rendezés

Bártházi András · 2006. Május. 20. (Szo), 23.32
Jól ismerem az egyes rendezések időigényét, csak nem gondoltam az elején, hogy ennyire számítana. Mielőtt a beépített sort() függvényre áttértem volna, végigmentem pár algoritmuson, köztük a quicksort-on, de az adott helyzetben jobbon is (meg ne kérdezzed melyik, mert már nem tudom, mit találtam a neten - egy olyat, ami kevés összehasonlítással és adatmozgatással dolgozott), de egyik sem ért - értelemszerűen - a beépített C-ben (vagy miben írják az Explorert?) rendezés közelébe. Arra gondoltam, hogy esetleg találok egy olyat, ami a cserék és összehasonlítások kevesebb száma miatt mégis gyorsabb tud lenni, de nem jött be. Egy másik trükk, amit be akartam vetni, hogy nem az eredeti tömböt rendezem, hanem egy lebutítottat - gondoltam ha kevesebb adatmennyiséget kell mozgatni, az gyorsabb lehet - de ez sem vált be, a rendezés nem lett szignifikánsan gyorsabb, de a segédtömb használata miatt még lassabb is lett a végeredmény.
11

quick sort

Balogh Tibor · 2006. Május. 21. (V), 13.30
A buborék rendezés időigénye O(n^2),
  • De csak akkor, ha a sorozat már rendezett részét is tovább rendezzük.
  • A buborék - ha alkalmazzuk a volt csere jelöléssel is,akkor - a leggyorsabb rendezés, ha már rendezett sorozatot rendeztetünk vele. Ebben az esetben egyik quick sort sem tudja lekörözni.

míg a quick sorté O(n*lg(n)), a különbség drasztikus n növekedtével.
  • Csak akkor ennyi, ha rendre mindig két egyenlő részre tudnánk osztani a sorozatot. A rendezés ehhez az ideális értékhez közelít.
  • Már rendezett sorozatnál a Hoare-féle gyorsrendezés n*n összehasonlítást végez.

Akit esetleg bővebben érdekelnek a rendezések: informatika alapjai jegyzet - 21. és 33. oldal.
8

Idő

Bártházi András · 2006. Május. 20. (Szo), 23.37
Még egy érdekes tapasztalat. A méréseim szerint egy utasítás végrehajtása nagyságrendileg ms-os JavaScript esetén (természetesen adott gépen, adott környezetben). Ez lehetne egész gyors is - a gyakorlat mutatja, hogy nagyon sokmindenhez elegendő, de ha 700 elemen kell valamit csinálni, az egyből 0.7, 1.4, 2.1, stb. másodpercet jelent, ami azért így már elég sok.
10

Gmail

Joó Ádám · 2006. Május. 21. (V), 10.44
Mint tipikus AJAX alkalmazásnál, én a Gmail-nél is tapasztaltam zavaró lassulást. Leginkább a bejövő fiók meghívásánál, akár 3-7 mp-et is töltöget, és ez alatt az idő alatt a FireFox (!) lebénul (vajon milyen lehet Explorerrel?).
Többször is kacérkodtam már a HTML verzióra való áttéréssel, de túl kényelmes vagyok :)
13

IE + gmail

Marcell · 2006. Május. 21. (V), 22.22
IE 6.0 alatt repül a Gmail... gyorsabb mint FF alatt.
12

Izgalmas téma

Dohány Tamás · 2006. Május. 21. (V), 17.50
Köszi és várom a folytatást!
14

reklám

adriankoooo · 2006. Május. 22. (H), 15.14
Azért mijen nagy reklám az Ajax mosószer vagymijen szer gyártójának az AJAX technológia nem? Például András itt a mosószer képével dobta fel az bejegyzést. Tudat alatt reklámokkal tomnek minket :).
21

A geek programozó

Bártházi András · 2006. Május. 27. (Szo), 12.29
Valamiért úgy gondolom, hogy kevés AJAX programozó jár a boltba felmosószert/tisztítószert venni, s ha jár is, akkor sem ez alapján fog dönteni. Részemről mindig igyekszem a lehető legjobb ár/érték arányú megoldást kiválasztani (vagyis nem a hype a döntő), plusz tisztítószert az utóbbi években biztosan nem én választottam, így nálunk a háztartásban sem nagyon fordul elő ilyen. Összefoglalva: ugyan tényleg nagy reklám a gyártónak, csak teljesen rossz célcsoportban.
15

Ajax vs. sok adat

amonrpg · 2006. Május. 22. (H), 16.33
Nos. Én mostanában leginkább AJAX-os cuccokat csinálok.
A következő tapasztalataim vannak:

Nagy adatmennyiséget kezelni sem IE-ben, sem FF-ben, de főképpen Safariban nem érdemes, ilyen esetekre érdemes oldalfrissítést csinálni.
Az AJAX lényege éppen az apróbb változtatások, kisebb oldalrészletek frissítése lenne.

Amíg a JS fut, az IE gyakorlatilag áll.!
Tehát ezt figyelembe kell venni az oldal feldolgozásakor.
Nincs Sleep fgv, amivel közben végrehajtatnánk a többi threadet, mert ilyet nem csinál. :D

Az FF xmlHttpRequest objektuma memory leak-el, nem is kicsit.
Ahol (pár óra használat mellett) kb. 5-10 másodpercenként kérek adatot a szerverről (chat alkalmazás), az IE 40-50M memórával el van, ott az FF nem ritkán felkúszik 200-300M környékére. A kódot hatszor átnéztem, nem leakel (amennyire a JSben el lehet érni, hogy ne leakeljen :D)

Első körben ennyit.
16

Sleep

Bártházi András · 2006. Május. 22. (H), 17.59
Van sleep, csak nem pont így. Egy olyat lehet csinálni, hogy feldolgoz az ember x. elemet, majd időzíti a következő végrehajtást párszáz ms-mal későbbre. Ez persze lassítja a feldolgozást, de egy kis lélegzethez engedi jutni az Explorert.
17

Sleep

amonrpg · 2006. Május. 22. (H), 18.04
Igen, tudom. Természetesen.
Ez inkább reflektálás volt a cikkben található 100% CPU idő, illetve az állni látszék az IE felvetésre. Márminthogy, ezért állt.
18

ebbe már én is belefutottam.

Anonymous · 2006. Május. 23. (K), 11.02
ebbe már én is belefutottam.
nálam egy ldap lekérdetés eredményét (kb 600 találat) kellett rendezgetni.
ami még nehezített, hogy ezt az alkalmazást a pII-300MHz/128MB körüli gépeken is használni kellett.
ezért én is a phpben megfelelően rendezett adathalmazt küldözgetem vissza.
mivel intraneten használják, ezért ez kisebb overloadot jelent kliens szinten... mondjuk egy ilyen adathalmaz lerenderelése egy fent említett masinán 3-4 s (és közben az adathalmaz eleje már látható. tehát használható a lista), mig a rendezéssel együtt ez akár meg is tudta fagyasztani a gépet :(. Mondjuk én csak a legminimálisabbat optimalizáltam ie-re, mert sok a bugróka, és ha minden igaz akkor a kettőtől ez lesz a policy.

mrbond
19

ajax leírás

Anonymous · 2006. Május. 24. (Sze), 08.54
Szeretnék részletesebben olvasni az Ajax-ról. Tudtok lelőhelyeket esetleg?
KF
20

ajax doksik

Anonymous · 2006. Május. 24. (Sze), 09.01
Összegyűjtött leírások:
http://www.maxkiesler.com/index.php/weblog/comments/round_up_of_30_ajax_tutorials/
22

tenksz'

Anonymous · 2006. Jún. 6. (K), 08.25
köszönöm...
23

AJAXSLT

Benjamin · 2006. Jún. 10. (Szo), 01.24
A Google AJAXSLT nem merult fel mint lehetoseg?
24

Nem

Bártházi András · 2006. Jún. 10. (Szo), 08.08
Nem, mivel kliens oldalon összetett rendezésre, szűrésre, átalakítása, feldolgozásra volt szükség, amire az XSLT nincsen felkészülve.
25

Kedvenc rendezés :))

Anonymous · 2006. Aug. 23. (Sze), 00.03
váóó!

A heapsort ugyebár helyben rendez, valamint alig lassabb mint "gyors" barátja.

Amúgy a Firefox Javascript-je talán azért gyorsabb, mert SpiderMonkey-t használ?

Egyébként meg a Javascript-et számolásra késztetni, búúú...
26

Hmm

Bártházi András · 2006. Aug. 23. (Sze), 05.23
Ez itt most hogy jött ide? Arról volt szó, hogy az XSLT lehetőségeinél összetettebb számításokra volt szükség, ezért a JavaScript számítási képességeit kellett igénybe venni. A szerveren nem volt számítási kapacitás, mivel ez egy tömegalkalmazás, amit több százezren is fognak akár használni egy nap (igen, nem magyar).
27

Mi okozza?

Edit · 2006. Okt. 19. (Cs), 14.43
A Yahoo egyik vezető mérnöke az IE memória szivárgás okairól.
28

Tutorial

Anonymous · 2006. Nov. 7. (K), 23.13
Normális AJAX tutoriált tudtok ajánlani? volt 1 link a commentek között azt most fogom megtekinteni. aki tudna mást az kérem jelezze! Thx.

- kisPocok -