Forbedre localStorage og sessionStorage test

Tags:    javascript

Hej

Jeg har lavet denne side :
http://scootergrisen.dk/htmlgrisen/eksempler/eksempel0007.html

På siden kan man teste hvor mange tegn der maksimalt kan gemmes i browserens localStorage og sessionStorage dataområder som er noget nyt Javascript noget i stil med cookies hvor hjemmesiden kan gemme data på brugerens computer.

Nå men testen virker men koden er ikke særlig flot fordi jeg vidste ikke hvordan jeg skulle lave det på en smart måde.

En dårlig måde man kunne gøre det på for at finde ud af hvor mange tegn der kan gemmes er at man først prøver at gemme 1 tegn også lytter man efter fejlkode 22 exeception hvilket betyder at der ikke kan gemmes så mange tegn. Hvis fejlen ikke er der prøver man med 2 tegn, også 3 tegn også 4 tegn osv.
Det vil jo tage meget lang tid og teste 1 tegn af gange da der kan gemmes millioner af tegn.

Derfor har jeg lavet det sådan her :
Prøv og gem 1 MB. Hvis det lykkes så prøv og gem 2 MB. Ellers træk 1 MB fra og forsæt ved næste kode...
Prøv og læg 16 KB til og gem. Hvis det lykkes så læg 16 KB mere til. Ellers træk 16 KB fra og forsæt ved næste kode...
Prøv og læg 1 KB til og gem. Hvis det lykkes så læg 1 KB mere til. Ellers træk 1 KB fra og forsæt ved næste kode...
Prøv og læg 16 byte til og gem. Hvis det lykkes så læg 16 byte mere til. Ellers træk 16 byte fra og forsæt ved næste kode...
Prøv og læg 1 byte til og gem. Hvis det lykkes så læg 1 byte mere til. Ellers træk 1 byte fra og forsæt ved næste kode...
Indtil den præcise grænse er fundet.

Håber i forstår hvad jeg mener.

I koden ses at jeg har opretter en del funktioner som er meget ens fordi jeg ikke vidste hvordan jeg ellers skulle gøre det.
Det ville være bedre hvis jeg kunne have færre funktioner og fjerne unødvendig kode.

I kan eventuelt læse mere om storage på denne side jeg har skrevet hvor testen også er at finde : http://scootergrisen.dk/htmlgrisen/storage.php



Indlæg senest redigeret d. 21.05.2012 15:04 af Bruger #13010
9 svar postet i denne tråd vises herunder
3 indlæg har modtaget i alt 16 karma
Sorter efter stemmer Sorter efter dato
Brug en binær søgning. Pseudokode:

Fold kodeboks ind/udKode 




Indlæg senest redigeret d. 24.05.2012 13:00 af Bruger #2695
Jeg kan prøve at forklare, hvad der sker. Lad os sige, at man kan allokere 380 bytes, bare for at tage et tal ud af lufte.

Først skal vi finde et interval, hvor tallet ligger i. Et minimum som man KAN allokere, og et maximum, som man IKKE kan allokere. Det rigtige tal ligger et sted imellem disse to tal. Det gør vi med den første del af koden.

Først tester vi med én byte, og det går godt. Så fordobler vi og tester med to bytes, og det går også godt.
Vi fortsætter med 4...8...16..32..64..128..256 og så med 512. Det går galt.
Vi kan altså allokere et sted mellem 256 og 512 bytes.

Nu bruger vi så den anden del af koden til at finde det eksakte tal og det gør vi ved hele tiden at justere minimum og maksimum så vi skærer halvdelen af mulighederne fra.

Tallet midt imellem 256 og 512 er (256 + 512 + 1) / 2 = 384

Jeg lægger én til og fjerner en evt. rest...for at runde op.
Vi tester med 384 og det går også galt.

Altså kan vi udelukke alle tallene fra 384 til 512 og koncentrere os om tallene fra 256 til 383 som stadig er mulige.

Vi tester igen: (256 + 383 + 1) / 2 = 320 og det går godt
Så vi kan skære tallene fra 256 til 319 væk og koncentrere os om tallene fra 320 til 383.
Vi fortsætter: (320 + 383 + 1) / 2 = 352 og det går godt
(352 + 383 + 1) / 2 = 368 og det går godt
(368 + 383 + 1) / 2 = 376 og det går godt
(376 + 383 + 1) / 2 = 380 og det går godt
(380 + 383 + 1) / 2 = 382 og det går IKKE godt
(380 + 381 + 1) / 2 = 381 og det går IKKE godt

Vores maximum og minumum er nu begge 380 og derfor har vi fundet vores eksakte tal.

Denne teknik kaldes "divide an conquer"...man deler hele tiden problemområdet op i to lige store halvdele og forkaster den ene, så selvom tallet var en million, så ville det være relativt få tests, vi skal gannemføre, for i første omgang kan vi forkaste en halv million tal.



Brug Math.floor()...parseInt er til strenge.

Det burde ikke være nødvendigt at bruge setInterval for det bliver meget få skrivninger. Det tager ca. 40 skrivninger hvis man kan gemme en million bytes. To skrivninger mere, hvis man kan gemme to millioner, to mere hviss man kan gemme fire millioner, og så videre.



Ok det må man da sige er noget mindre kode.
Jeg fatter ikke koden men kigger noget mere på det når jeg er hjemme og ser om jeg kan finde ud af det.



Ok det må man da sige er noget mindre kode.
Jeg fatter ikke koden men kigger noget mere på det når jeg er hjemme og ser om jeg kan finde ud af det.
Du kan evt. Læse mere om Binær Søgning her - http://en.wikipedia.org/wiki/Binary_search_algorithm



Jeg er ved at finde ud af noget kode.

Men der hvis vi devider med 2. Altså finder det halve der vil det jo lave kommatal hvis det er et uligetal så skal jeg vel bruge parseInt() ikke ?

Fold kodeboks ind/udJScript kode 


Og hvad er den bedst måde at lave koden på fordi jeg tænker det vil være smart at bruge setInterval() til at kunne bestemme hvor lang tids pause der er imellem hver forsøg på at gemme data sådan at systemets ikke bare fryser under testen.

Min kode er ikke så god at den er værd at vise endnu.



Indlæg senest redigeret d. 25.05.2012 15:05 af Bruger #13010
Ja men det tager noget tid at skrive dataen på brugerens computer og jeg oplever at de jeg prøver at skrive i browseren med .innerHTML det vises ikke en af gangen men i stedet kommer det BUM! alle beskeder til sidst på en gang.
Derfor ville jeg gerne kunne bestemme et interval.



@Scootergrisen: Det skyldes at koden bliver optimeret og eksekveres på så kort tid, at skærmen kun når at opdatere (refreshe) een gang. Som Robert siger bliver der næppe behov for at teste så mange gange at browseren fryser. Hvis den så alligevel gør det, jamen så smid det ind i et setInterval loop med 13ms delay eller lign.



Browseren kan fryse rigtig meget. For eksempel i Firefox når man trykker på test knappen så når man giver slib så er knappen stadig trykket ned og der gå for eksempel 18 sekunder før brugeren får besked på der sker noget så kommer det alt sammen efter 18 sekunder men det jo ikke så godt så.

Gider i prøve og se på den kode jeg har lavet her hvor jeg har prøvet at lave det med det der bitsøgning og se hvad jeg kan forbedre :
http://scootergrisen.dk/htmlgrisen/eksempler/eksempel0008.html

Sammenlign eventuelt med den gamle kode som ikke fryser browseren så meget :
http://scootergrisen.dk/htmlgrisen/eksempler/eksempel0007.html



Indlæg senest redigeret d. 26.05.2012 15:46 af Bruger #13010
t