Salve ragazzi,
Scrivo dopo tanti anni qui più che altro come sfogo che come altro...
Ho passato parte del pomeriggio e della notte a cercare di capire perchè il mio software che analizza un file di 700kb contenente circa 100.000 numeri all'interno ci mettesse 2 secondi e rotti quando alla fine sono arrivato alla conclusione che la funzione Double.parseDouble() del Java quando viene richiamata moltissime volte (come nel mio caso) è mooooooooooooooooooooooooooooooooooolto lenta!
Vi posto il codice che io ho utilizzato ed utilizzo ancora adesso (probabilmente utilizzerò per il resto della vita!) e che mi ha consentito di ridurre i tempi a 400ms.
Se ci sono dei bug ditemi con che numero state provando che vedo subito di rimediare!codice://dato un numero stringa e la posizione in cui si trova la virgola ottiene la parte intera private static double getInteger(String text, int pointIndex) { double result=0; int cnt=0; int startIndex=0; int endIndex=text.length(); if(pointIndex!=-1) endIndex=pointIndex-1; for(int i=endIndex;i>=startIndex;i--) { char c=text.charAt(i); if(c<'0' || c>'9') throw new IllegalStateException("CHARACTER "+c+" AT POSITION "+i+" ISN'T DIGIT!"); double once=(c-'0')*(Math.pow(10, cnt)); result+=once; ++cnt; } return result; } //dato un numero stringa e la posizione in cui si trova la virgola ottiene la parte decimale private static double getDecimal(String text, int pointIndex) { double result=0; int cnt=1; int startIndex=pointIndex+1; int endIndex=text.length(); if(pointIndex==-1) startIndex=endIndex+1; for(int i=startIndex;i<endIndex;i++) { char c=text.charAt(i); if(c<'0' || c>'9') throw new IllegalStateException("CHARACTER "+c+" AT POSITION "+i+" ISN'T DIGIT!"); double once=(c-'0')*(1/Math.pow(10,cnt)); result+=once; ++cnt; } result=MathUtil.round(result, cnt-1); return result; } //alla rinfusa!!! public static Double parseDouble(String value) { Double result=null; try { int fromIndex=0; int sign=value.charAt(0); double multiply=1.0; switch (sign) { case '+': multiply=1.0; fromIndex=1; break; case '-': multiply=-1.0; fromIndex=1; break; } value=value.substring(fromIndex); int pointIndex=value.indexOf('.'); if(pointIndex==-1) pointIndex=value.indexOf(','); double integer=getInteger(value, pointIndex); double decimal=getDecimal(value, pointIndex); result=(integer+decimal)*multiply; } catch(Exception ex) { result=null; } return result; }
Ciao, ale500.![]()

) e che mi ha consentito di ridurre i tempi a 400ms.
Rispondi quotando