Avatar billede grave Nybegynder
15. juni 2001 - 00:27 Der er 8 kommentarer og
2 løsninger

StringTokenizer ???

hvis jeg skal linie for linie gå igennem en fil.
bliver jeg så nød til at lave en ny StringTokenizer for hver linie..
det går jo sindsyget langsomt.
er der ikke en metode til bare at skifte den String ud jeg vil have delt op ??
Avatar billede elster Nybegynder
15. juni 2001 - 02:37 #1
Nope, og alle dens variabler er private, så man kan heller nedarve fra den og skifte den String ud...

Hvis det er meget kritisk, vil jeg mene at det eneste der er at gøre, er at skrive sin egen klasse hvor du kan skifte strengen ud.

Du kan jo få det meste af koden i Sun\'s source for StringTokenizer.
Avatar billede delbing Nybegynder
15. juni 2001 - 08:34 #2
Går det sindssygt langsomt? Altså har du testet (profilet) og iagttaget at initialisering af StringTokenizere er en performance flaskehals?
Mit gæt er at det overhovedet ikke er langsomt, og slet ikke hvis du ser på hvad du ellers laver. Hver gang du siger nextToken(), så laver du et nyt String objekt, så den operation er ligeså dyr som at lave en StringTokenizer.
Hvis effektivitet er vigtigt så er det helt forkert at arbejde med Strings. Så står den på StringBuffer, char[], og nogle fikse hjælpeklasser
Avatar billede grave Nybegynder
15. juni 2001 - 10:19 #3
lines er en ArrayList der har en linie i en fil liggende i hvert element.

det er dette der går langsomt.
jeg har prøvet på min /etc/passwd fil den kører over 10 sekunder. det synes jeg er alt for langsomt !



for(int i = 0; i < lines.size(); i++) {
                        StringTokenizer token = new StringTokenizer(lines.get(i).toString(),\":\");
                        for(int j = 0; j <= (token.countTokens()+1); j++) {
                                System.out.println(token.nextToken());
                        }
                        System.out.println(\"=======================\");
                }
Avatar billede delbing Nybegynder
15. juni 2001 - 11:07 #4
Prøv denne:

        char delimiter = \':\';
        String line;
        char[] word;
        int start;
        for (int i=0; i < lines.size(); i++) {
            line = ((String)lines.get(i));
            start = 0;
            for (int j=0; j < line.length(); j++) {
                if (line.charAt(j)==delimiter)    {
                    word = new char[start-j+2];
                    line.getChars(start,j,word,0);
                    System.out.println(word));
                    start=j+1;
                }
            }   
        System.out.println(\"=======================\");

Eller denne:

        char delimiter = \':\';
        String line;
        int start;
        for (int i=0; i < lines.size(); i++) {
            line = ((String)lines.get(i));
            start = 0;
            for (int j=0; j < line.length(); j++) {
                if (line.charAt(j)==delimiter)    {
                    System.out.println(line.substring(start,j));
                    start=j+1;
                }
            }   
        System.out.println(\"=======================\");

Jeg tror den sidste er langsommere, da substring skal lave en ny String, som er langsommere end at lave et char[], men det er ikke til at sige hvor meget/hvordan det optimeres af JVM\'en.
Der skal lige rettes lidt hvis linierne ikke slutter med et \':\'.

Er du iøvrigt sikker på at det ikke er System.out.println(.) der bruger al tiden?
Avatar billede delbing Nybegynder
15. juni 2001 - 11:11 #5
word = new char[start-j+2];
er forkert, det skal være
word = new char[j-start]
Avatar billede grave Nybegynder
15. juni 2001 - 11:28 #6
jeg fatter det ikke !!!!!!!
jeg har kørt test på både min egen ting
og de 2 du har lavet og den er 15 sec. om at læse 43 linier.....
det er jo ufatteligt langsomt.....

er der ikke en helt anden måde at checke i en passwd fil på som er hurtigere ???
Avatar billede delbing Nybegynder
15. juni 2001 - 11:36 #7
jeg er ikke helt klar over hvad det er du skal checke...

Hvad er det som tager 15 sekunder? Er du sikker på det kun er den stump som vi har snakket om her?
Prøv før den med:

long begin = System.currentTimeMillis();

og til sidst

System.out.println(System.currentTimeMillis() - time);
Avatar billede grave Nybegynder
15. juni 2001 - 11:44 #8
jeg har en klasse der kalder denne og i den laver lavede jeg da jeg testede i starten en Thread.sleep(300)... den fik jeg ikke fjernet igen !!!

hold kæft en dummert !!!!!!!!!!!!!!

i må dele pointene !
Avatar billede grave Nybegynder
15. juni 2001 - 11:47 #9
delbing du for lidt mere for din insats...

er stadig flov !
Avatar billede delbing Nybegynder
15. juni 2001 - 11:52 #10
Husk at profilere! Hvis du ikke har et værktøj til det, så tag tid som jeg viste ovenover, så du ved hvor lang tid der bruges i hver kodestump. På den måde kan du spore dig ind på hvor det går langsomt - bare at kigge ned i koden og sige \"det må være der\" duer (som regel) ikke.

Jeg kan godt huske du postede et eksempel hvor den tog en pause på 300 ms inde i et loop - jeg var lige ved at kommentere det, men besluttede mig for at det nok var fordi du ville kunne nå at læse hvad der blev skrevet på skærmen

Jeg troede du havde millioner af linier i den ArrayList... ;)
Avatar billede Ny bruger Nybegynder

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.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester