2013-09-24, 10:18
  #1
Medlem
Hej,

Har upptkt en skum grej i JAVA. Jag utvecklar en ganska berkningskrvande applikation som genererar ljud. Har dock haft problem med att programmet under utvecklingens gng blir en faktor 50 lngsammare. Har letat i tv veckor i koden efter felet/buggen som slar ner och hittat fljande:

Koden som r snabb:

Kod:
void CalcSoundFromInput(){
   //ls in data in i en matris
   double[][] MATRIS1= {matrisdata};

   BERAKNA();

   SPOTTA_UT_RESULTAT();
}

Koden som r 50 ggr lngsammare

Kod:
void CalcSoundFromInput(){
   //ls in data in i en matris
   double[][] MATRIS1= {matrisdata};
   double[][] MATRIS2= {matrisdata};

   BERAKNA();

   SPOTTA_UT_RESULTAT();
}
Den enda skillnaden mellan berkningarna r att i den lngsamma koden lser jag in tv matriser.
Detta slar ner JAVA-koden med en faktor 50.

Jag har ven prvat att i stllet fr double matriser gra matriser av shorts i tron att spara minne skulle snabba upp koden. Men det verkar som att tv matriser (2st. 2dimensionella-arrayer) i koden oavsett datatyp och storlek slar ner koden.

Skulle vara tacksam om ngon kunde frklara hur det kan bli shr och hur jag kan gra fr att snabba p koden. r inte detta helskummt?
Citera
2013-09-24, 11:21
  #2
Medlem
Antts avatar
Vad har du fr komplexitet p BERKNA()?

Jag antar att du gr berkningar som anvnder MATRIS1 och MATRIS2. Om BERKNA har en hg (tids)komplexitet s r det inte s konstigt att det gr lngsamt, du kar trots allt antalet vrden att ta med i berkningen.

vrigt tips: Ta en titt p namnkonventionerna i java fr att gra din kod mer lsbar. Det r frsts inga problem nr det r s hr lite, men det kan vara bra att veta i fortsttningen. Lycka till!
Citera
2013-09-24, 11:31
  #3
Medlem
Tooners avatar
Koden du skrivit hr visar ingenting om ngonting... "berakna" tar ju inte ens matriserna som parametrar.

Frstr att du frskt gra nn slags pseudokod, men den sger ingenting, s visa mer om du vill ha bttre svar.

Men en ls gissning r att du tror att du bara delar upp matrisen och att komplexiteten inte skulle ka, men istllet s kar du komplexiteten exponentiellt (kombinerar de tv matriserna p ngot stt som du inte tnkt p).
__________________
Senast redigerad av Tooner 2013-09-24 kl. 11:33.
Citera
2013-09-24, 15:40
  #4
Medlem
Hej,

Tack fr era svar. Hela projektet r upp i 4000 rader kod. Lite svrt att skicka upp hr.

Grejen r dock att det r bara den ena matrisen som anvnds i berkningen. Den andra matrisen anvnds inte som koden ser ut nu. Man tycker ju att JAVA-skrphanteraren borde rensa bort matrisen som inte anvnds och drmet inte pverka berkningstiden, men det gr det. Kan java bli segt om man har fr mnga variabler till antal? Jag hller p med ljudarrayer som tar en heldel minne.

Jag funderar p att skicka in hela projektet till ORACLE.
Citera
2013-09-24, 20:46
  #5
Medlem
Antts avatar
GC kan ta lite tid, s om du hejdlst skapar och slnger objekt s kan det ha en ganska stor inverkan p prestanda. Jag r inte sker p hur JVM hanterar minne, men jag kan tnka mig att det (precis som i alla sprk och miljer) tar lite tid att ka/minska heapstorleken. Nu gissar jag bara lite, men det kan vara vrt att testa att starta JVM med lite strre heap (min. och max.).
Citera
2013-09-24, 20:57
  #6
Medlem
Diamondgrits avatar
Citat:
Ursprungligen postat av springa
Jag har ven prvat att i stllet fr double matriser gra matriser av shorts i tron att spara minne skulle snabba upp koden. Men det verkar som att tv matriser (2st. 2dimensionella-arrayer) i koden oavsett datatyp och storlek slar ner koden.
Ja, Java r lite dumt ibland.

Testa att gra en tredimensionell array istllet. Allts dr frsta elementet r det som du nu lgger i matris1 och andra elementet r det som du lgger i matris2.
Citera

Skapa ett konto eller logga in för att kommentera

Du måste vara medlem för att kunna kommentera

Skapa ett konto

Det är enkelt att registrera ett nytt konto

Bli medlem

Logga in

Har du redan ett konto? Logga in här

Logga in