pegoMedlem sedan sep. 200110 inlägg Har ett resultset innehållande 125 rader med 5 kolumner=625 poster totalt. följande kodrader tar cirka 35 sekunder !! när jag loopar genom resultset:
Hashtable h=new Hashtable();
while(rs.next())
{
Object priceholder[]=new Object[5];
priceholder[0]=Integer.toString(rs.getInt("artikelnr"));
priceholder[1]=rs.getString("benamning");
priceholder[2]=Integer.toString(rs.getInt("forpackning"));
priceholder[3]=Integer.toString(rs.getInt("pris_1"));
priceholder[4]=Integer.toString(rs.getInt("pris_2"));
h.put(priceholder[0],priceholder);
}
Kör på en 500 mhz maskin med gott om minne så det borde inte vara datorn som är problemet. Hur ska jag bära mig åt för att snabba upp loopningen. Har prövat att lägga det i en Vector men det är lika trögt. Förslag mottages tacksamt.
Tror du kan köra rs.getString("blabla"); även om det ligger som en int så slipper du parsa överallt...
phonk
spangoMedlem sedan juni 20008 205 inlägg Re: Prestandaproblem
Ursprungligen av pego Har prövat att lägga det i en Vector men det är lika trögt.
Inte för att jag tror att det kommer att göra någon skillnad, men om du provat att använda en Vector känns inte Hashtable riktigt rätt. Det du bör använda är ArrayList. Den fungerar som en Vector, men där Vector är synkroniserad är inte ArrayList (eller LinkedList) det (och om du skulle vilja ha synkat kan du anropa Collections.synchronizedCollection(dinArrayList)).
Hashtable å andra sidan, är tänkt att fungera som en nyckel/värdesamling och inte som en dynamisk array. Jag skulle inte tro att den är särskilt mycket långsammare än exempelvis ArrayList, men eftersom den måste utföra vissa beräkningar där ArrayList bara slänger in saker i en vektor så kan det gå lite långsammare.
Och som sagt, använda getString() rakt igenom om du ändå kommer att göra strängar av allt.
Men att det här ska ta 35 sekunder låter absurt (ens med en dålig JVM på en dålig dator). Det kan inte vara databasen som är skum, då?
PeWMedlem sedan juni 200010 432 inlägg
men eftersom den måste utföra vissa beräkningar där ArrayList bara slänger in saker i en vektor så kan det gå lite långsammare.
Beräkningarna är ytterst marginella... men om är något med det som strular så är det isf kollisionerna som tar tid (det vill säga att den står och tuggar tills det blir rätt). Det är oftast bättre att plita ihop en egen hashmetod eftersom java-standard använder adressen som hashnyckel.
Skulle inte förvåna mig ett dugg om det är din hashning som spökar om det blir mycket krockar + ev. db'n som spango skrev.
Kolla dokumentationen om du inte kan prova att optimera din tabell genom att öka dess kapacitet.
r
redigerat pga hjärnsläpp :r ;)
Gör en PriceHolder-databöna som håller de fem olika värdena med setters och getters-metoder istället för att använda en objektarray. På så sätt så instansierar du endast ett objekt per loop istället för som nu fem stycken.
Jag vet inte hur mycket du tjänar men alltid är det något plus att det är snudd på sinnessjukt mycket snyggare rent designmässigt ;).
Använd även index istället för kolumnnamn i utplockningen från resulset:et. Jag har för mig att det kostar mindre :).
Typ så här skulle det då se ut:
ArrayList prices = new ArrayList();
while(rs.next()) {
PriceHolder priceholder = new PriceHolder();
priceholder.setArtNr(rs.getInt(1));
priceholder.setBenamning(rs.getString(2));
priceholder.setForpackning(rs.getInt(3));
priceholder.setPris1(rs.getInt(4));
priceholdersetPris2(rs.getInt(5));
prices.add(priceholder);
}