25. april 2003 - 13:03Der er
18 kommentarer og 1 løsning
JavaScript engine i IE 6.0 crasher periodisk
Jeg er ved at lave en browser baseret applikation, der bruger meget JavaScript. Når jeg sætter applikationen til at hente og afvikle en masse JavaScript (DHTML), ændre noget i dom strukturen og hente en side i en iframe samtidig, så sker det 1 ud af 5 gange at JavaScript engine i IE 6.0 crasher. Jeg ved at det er JavaScript enginen der cracher, da der ikke er noget JS der virker, heller ikke I andre browsere der er lavet via CTRL + n eller filer -> ny -> ny vindue.
Jeg har testet, debugget og tracet på det i et par uger nu (ja, det er en stor applikation), men er ikke kommet nærmere på hvad det kunne være.
Jeg har dog en mistanke om at det er fordi jeg bruger htc’er i applikationen, da jeg har oplevet problemet i en anden applikation, hvor jeg også bruger htc’er. Men det er meget periodisk, og det jeg kan ikke indsnævre det til en ting der er galt.
jeg har aldrig rodet med htc'er, men du siger at det sker når du roder med DOM strukturen... Jeg erindrer at jakoba har fortalt at javascript ikke har så mange stakke til rekursion. Bruger du meget rekursion til at bladre igennem DOM træet?
Nope. Jeg tilfår elementerne direkte. Men det sker når jeg giver browseren noget at lave. dvs beder den hente en fil en en iframe, resize nogle dom elementer, køre omkring 100-200 kb javascript kode igemmen og sådan lidt....
kan det være et samtidigheds-problem. det er meget kode at køre, og selvom det i teorien et korrekt kodet kan det være at JScript ikke er "robust" nok til at håndtere flere resourcer er i brug. Det kunne f.x. være at to funktioner er under afvikling på samme tid og har brug for samme resource. Jeg ved ikke nok om hvorledes JavaScript afvikles til at kunne sige noget definitivt. Jeg håber at nogle af de rigtig seje kodere (dem der kender deres teori) kigger forbi og tager et kig. Hvis der er mulighed for at koden generer en fejl kan du gribe fejlen og derved sikre at programmet forsat kan afvikles. Eks: <script> var r =5; try { r.list(); } catch (e) { alert(e.name+"\n"+e.message+"\nError Code:"+e.number); } </script>
Hej Karto, din høje slanke krølhårede monsterkoder :D Jeg kan se, intet har ændret sig: "Jeg ved at det er JavaScript enginen der cracher, da der ikke er noget JS der virker, heller ikke I andre browsere ..." *LooooL* Nå, nu skal jeg nok _prøve_ at opføre mig pænt ;o)
Som du ved, har rodet rigtig meget med HTC'ere og 'tunge' JavaScripts. Fornylig har jeg lavet lidt af en monster-app på over en Mb - helt uden probs.
Men da JS trods alt er et 'lille' script-sprog, skal man være yderst varsom og tænke grundigt over performance i hvert enkelt led. Nogle absolutte no-no's i store apps er: 1. CSS-klasseskift (skift enkelt-properties i stedet) 2. Udskrivning af enkelt-linier (fyld i stedet et array og join det) 3. Brug af CSS-expressions (de kan være fede - men er _tunge_)
Da jeg går udfra, du anvender mange komplicerede ranges, skal du også huske at collapse dem igen.
det er ved at være længe siden, har du det godt? Som du ved, så ligger jeg på samme niveau som dig når det kommer til DHTML kodning. Og de regler du angiver er der jo ikke noget nyt i, sådan ahr det jo altid været.
Og problemet er ikke performance, men derimod at IE periodisk cracher, og at der ikke er noget system i det.
Når det sker, så kommer den ikke med fejl, eller andet, den holder bare op med at afvikle JS. Det ses bl.a. ved at mouse over ikke virker osv.
Når det virker, så køre det uden problemer, what so ever.
Den går typisk ned, når jeg loader en side i EasySite. Siden den loader indeholder en dropdown menu (htc), en toolbar(htc), nogle faneblade (alm html og js), 10 i frames, der bliver resizet mens den loader, inde i den ene iframe loader den en ny side, der indeholder mellem 4 og 10 htc'er a 25 kb stykket, og så en masse html på selve siden.
Hehe ... karto er en tidligere kollega, så han kender mine evner - og mangel på samme ;o)
karto >> Jamen, så fik jeg jo også lært noget idag - men det er rart at høre, du har højnet dit DHTML-niveau. Jaja, jeg sagde jo kun, jeg ville _prøve_ at opføre mig pænt ;oD
Med hensyn til IE's crashes, så er der jo ikke så mange muligheder: En ulovlig handling - eller en eller anden form for manglende headroom i forhold til afviklingen af din kode. Derfor er jeg temmelig sikker på, du skal kikke på din kodes performance. Ikke mindst, hvis du gør brug af nogle af de no-no's, jeg beskrev før. Jeg sætter gerne en 2-liters polsk Cola og et par poser 'krisser' på højkant på, at det er der, du skal finde årsagen ;o) /mvh
Jeg har ikke lavet nogle af de no-no's du har beskrevet. Og selvfølgelig ville det hjælpe at optimere performance på systemet, da jeg tror det er fordi JS engienen bliver overbelastet. Men den eneste måde jeg kan optimere det på er ved at fjerne features, og det sker ikke. (Du kender de andre her inde) :-)
Men jeg kan bare ikke forstå at IE's JS engine kan gå ned periodisk, og uden at komme med en fejl besked... Jeg tror at næste skridt er at snakke med MS om det...
Så skal jeg bare til at bruge forbindelserne til at finde en person hos MS der ved noget om IE, istedet for en eller anden skide supporter der alligevel ikke ved noget.. :-)
Det er bare irriterende at jeg ikke kan finde en (eller et par) linie kode, der er årsagen... jeg har været ude for det et par gange før, men der tænkte jeg jo ikke vidre over det.. :-( ... Det sker kun når jeg har alt koden til at køre samtidig, hvilket så henleder tanken på en buffer overflow i JS enginen....
Har du prøvet at sætte dine arrays' length til 0, når du har brugt dem - og at genbruge variabler til flere ting. Du har formodentlig en bunke 'lort' liggende og 'rode' (det tårner sig hurtigt op) - og der _er_ grænser for, hvad JS-motoren kan 'huske' og håndtere samtidigt :)
Det, du skriver med 'buffer-overflow', tyder på, vi mener det samme. Det er to sider af samme sag ;o)
Men hvis det er pga. for meget "lort" så burde det være koncekvent, og ikke kun periodisk. Det kan komme både når man lige har genstaret, og det kan komme efter at computeren har stået tændt i 3 mdr.. Og efter at have lukket browseren og startet den igen en 10-20 gange, så virker det igen.... :-)
Martin, du misforstår :) Det er 'kode-affald' i browseren, jeg taler om. Hvis du f.eks. opretter 50 arrays, der alle har en masse elementer, opbygger du hurtigt en bunke overflødigt 'lort', som du _har_ brugt - men ikke længere har brug for. Det ligger og 'fylder'. Arrays kan du rytte op i ved at sætte deres length til 0. /mvh
Naa, jeg ved godt hvad du mener, det er dig der misforstår mit svar.
Hvis der er for meget "lort" / "affald" eller noget i browseren, så er det jo den samme mængde der kommer hver gang man køre det samme script. Og så burde browseren jo gå ned hver gang (eller overleve hver gang)
Det forholder sig desværre ikke, som du formoder. Når du kommer helt op under loftet i IE, bliver den ustabil - og det er ikke altid, den vælter på samme punkt. Når man skriver meget store JS-applikationer, er problemet ikke at få de enkelte stumper til at virke - det er som oftest 'piece of cake'. Kunsten ligger i at effektivisere koden, så den kan køre i sammenhæng. Det kræver enormt god kodeskik og meget grundige overvejelser og effektivitetstestning. Hver eneste linie skal overvejes i hoved og r..
Skriver man småscripts betyder det ikke så meget. Det gør det tit heller ikke, når man scripter på serveren (den har betydelig flere muskler at spille med) - men når man scripter store apps på klienten, er det noget helt andet.
Problemet er fantastisk udbredt (det er faktisk meget sjældent at opleve andet) blandt kodere og scriptere ... langt mere end blandt rigtige programmører. Formodentlig fordi de sidstnævnte har fået det ind med en grundig uddannelse i modsætning til kodere og scriptere, der oftest er selvlærte.
Backend'en på EasySite har (eller havde sidst, jeg så den) præcis samme mangler, men der mærker man det som sagt ikke så meget.
1. Udryd al redundans. 2. Gør koden objektorienteret, hvor det er en fordel (det er det langt fra altid). 3. Ryd seriøst op i alle data-containere (variabler og arrays) under afviklingen. 4. Kort variabel- og funktionsnavne ned til det mindst mulige. 5. Test, test og test igen alle stumpers afviklingstider. ... Så kan du flytte loftet meget væsentligt opad.
Det er ganske rigtig, hvad du skriver om samtidighed i IE, men den kan sagtens snuble over sine egne fødder, hvis koden ikke er afstemt ordentligt. Her kan enkelte delays hjælpe ganske væsentligt.
Det er desværre det bedste, jeg kan gøre for dig uden at se koden - og bruge en rum tid med den. At skrive den slags apps tager lang tid, da den ofte skal skrives om flere gange - men det ved jeg godt, firmaet ikke har tid til. Det er lidt en Catch 22 situation. You're damned if you do 'n' you're damned if you don't :) /mvh
:-) Ja. Jeg er ved at prøve at fjerne nogle af alle mine HTC'er, for at se om det ikke hjælper. Det tror jeg det gør, men nu får vi af se. Jeg har den her uge til at finde ud af det, så forhåbentligt, så virker det uden htc'er, så skal det bare kodes om.
Ellers tak for sluderen, det er godt at høre at du stadig er i live :-)
/Karto
Synes godt om
Ny brugerNybegynder
Din løsning...
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.