In un'applicazione Android, desidero utilizzare la classe Scanner per leggere un elenco di float da un file di testo (è un elenco di coordinate del vertice per OpenGL). codice esatto è:java.util.Scanner è lento?
Scanner in = new Scanner(new BufferedInputStream(getAssets().open("vertexes.off")));
final float[] vertexes = new float[nrVertexes];
for(int i=0;i<nrVertexFloats;i++){
vertexes[i] = in.nextFloat();
}
Sembra, tuttavia, che questo è incredibilmente lento (ci sono voluti 30 minuti per leggere 10.000 carri!) - come testato sul 2.1 emulatore. Cosa sta succedendo? Non ricordo che Scanner sia così lento quando l'ho usato sul PC (a dire il vero non ho mai letto più di 100 valori prima). O è qualcos'altro, come leggere da un flusso di input di asset?
Grazie per l'aiuto!
Vorrei suggerire di profilarlo: http://developer.android.com/intl/zh-TW/guide/developing/tools/traceview.html – yanchenko
Grazie per il suggerimento. L'ho profilato (per 100 float) e sembra che le chiamate a nextFloat richiedano tutto il tempo. A causa di BufferedInputStream vengono effettuate solo 2 chiamate da leggere dall'input e richiedono pochissimo tempo (35 ms/chiamata). Comunque le chiamate a nextFloat richiedono 435ms/chiamata che è enorme. Osservando le chiamate dei bambini sembra che le chiamate all'interno di NumberFormat e Pattern siano gli assassini (molte allocazioni di memoria). Proverò qualche altro metodo di analisi e riferirò. –
Sembra che lo scanner sia davvero MOLTO lento sul dispositivo/emulatore! Potrebbe essere a causa dell'enorme numero di allocazioni di memoria. Sull'emulatore ci vogliono 30 minuti per leggere 10.000 galleggianti. Sul PC ci vuole 1 secondo per leggere 20.000 float (con Scanner). Come soluzione ho trovato il seguente che funziona molto bene: prima analizzo il mio file di input sul PC e lo trasformo in dati binari, quindi lo leggo sul dispositivo byte per byte (bufferizzato) e ricostruisco i numeri. Questo è MOLTO più veloce. Ci vogliono 1,5 secondi per leggere 20.000 galleggianti. Dico che è un enorme miglioramento da 1 ora :) Grazie per tutto l'aiuto! –