@Søren, jeg benytter ikke en incrementive algoritme, så derfor burde min løsning ikke lide (i samme grad) af det problem du nævner.
Jeg har nok ikke været lidt utydelig. Jeg mente longString funktionen. F.eks. har du 2,5MB og vil nu teste for 3,75MB, så lægger du ca. 100KB til indtil du er mere eller lig med og så reducerer du. Men det var da jeg troede at Javascript havde en primitiv streng konkatenering hvor den ville lave mange strenge på 2,5MB+ indtil den nåede 3,75MB. Siden Javascript har en effektiv strengkonkatering er det ikke noget problem.
Ja, strenge er immutable, men eftersom det er 'toString' delen og ikke selve allokeringen af arrayet der tager tid, er jeg nød til lave en streng ud af det hver gang, i stedet for bare at benytte et array, som man kunne pushe yderligere bytes til.
Det kom jeg også frem til da jeg prøvede at allokere i et hug (dengang jeg troede Javascript have primitiv konkatenering).
Nu var det her bare en hurtig løsning, da jeg ikke ville bruge for lang tid på det, men jeg kan forestille mig at ArrayBuffer og alle de nye TypedArrays ville være bedre egnet til denne opgave, men det må Scootergrisen selv ligge og rode med (Det er vel faktisk en meget god introduktion til netop disse).
Faktisk en god idé til senere Scootergris.
EDIT 2:: @Søren: Det er rigtigt at det ikke er en "ren" binær-søgning, men det skyldes at det implementation du benytter nu starter ved at allokere halvdelen af "max", og derved hvis Scootergrisen har behov for at tjekke for op til 50MB, starter den med at allokere 25MB (som er en tidskrævende process, og det ville gå hurtigere hvis man startede nedefra og arbejdede sig op.)
Igen tror jeg var nok utydelig. Jeg har ikke ment den var binær. Godt tænkt med at starte fra bunden og arbejde op. Det havde jeg ikke lige umiddelbart tænkt over
Der er dog lige problemet med limit som overskrider upper. Ved mig ender den ved at Javascript får en exception ved allokering af 256M tegn. En mulig løsning er at sætte limit til sand hvis den overvejer en size der er større:
- size = (limit) ? (lower + (upper-lower) / 2) : (size * 2);
- if (size > upper) {
- size = upper;
- limit = true;
- }
Indlæg senest redigeret d. 30.07.2012 18:46 af Bruger #14645