avere una copia separata del mStack
array con la rappresentazione di stringa, per impostazione predefinita inizializzato con una stringa vuota, in modo che il ciclo potrebbe essere:
String [] mStackCopy = new String[]{"","","","","","","","","","",};
// or mstackCopy = new String[mStack.length];
// for(int i = 0 ; i < mStackCopy.lenght ; i++) { mStack[i] = "" }
Inoltre, creare lo StringBuilder con una capacità sufficiente:
StringBuilder sb = new StringBuilder(10000);// 10k chars or whatever makes sense.
Così, quando è necessario creare il messaggio che si sarebbe semplicemente:
for (int i = 0; i <= step; i++) {
sb.append(mStackCopy[i]);
}
E vuoti parti non causerà un problema, perché sono già vuoto:
Si può anche codice difficile:
sb.append(mStackCopy[0]);
sb.append(mStackCopy[1]);
sb.append(mStackCopy[2]);
sb.append(mStackCopy[3]);
sb.append(mStackCopy[4]);
sb.append(mStackCopy[5]);
sb.append(mStackCopy[6]);
sb.append(mStackCopy[7]);
sb.append(mStackCopy[8]);
sb.append(mStackCopy[9]);
Ma questo avrebbe causato più dolore che sollievo in futuro, garantito.
quando si aggiunge qualcosa al tuo mStack:
MStack item = new MStack();
item.setCurrentMessage("Some message");
....
Basta fare una copia del messaggio e aggiungere il "" già.
addToMStack(int position, MStackItem item) {
mStack[position] = item;
mStackCopy[position] = item.getCurrentMessage() + ", ";
}
E a seconda del verificarsi di valori nulli (se basso) si può prendere loro
addToMStack(int position, MStackItem item) {
if(item == null) { return; }
mStack[position] = item;
try {
mStackCopy[position] = item.getCurrentMessage() + ", ";
} catch(NullPointerException npe){}
}
Qual è orrendo
O convalidarlo:
addToMStack(int position, MStackItem item) {
if(item == null) { return; }
mStack[position] = item;
mStackCopy[position] = item.getCurrentMessage() + ", ";
}
Sono abbastanza sicuro che il tuo metodo sta facendo qualcos'altro che tu non mostrarci Probabilmente la ragione è lì.
Inoltre, il 16% non è così male, se 100% è 1 sec.
Il tuo metodo dice che ha un tipo di ritorno di RatedMessage ma sembra restituire una stringa. Cosa sta succedendo? Inoltre, quanto sono grandi questi oggetti rm.msg, sono stringhe o c'è un implicito toString che viene chiamato su di loro? – luke
Spiacente, ho ridotto il codice alla parte essenziale. C'è un tasso, il numero float per ogni messaggio. rm sta per RatedMessage. – Pentium10
@ Pentium10, penso che tu abbia tagliato troppo. Hai un hotspot e in pratica stai assumendo che certe cose non siano il problema e poi chiedi del resto. Se hai un codice funzionante che hai dimostrato di essere lento ma più semplice (se rotto nel senso che dà la risposta sbagliata), è grandioso, ma non tagliare così tanto e aspettarti di ottenere una risposta significativa qui. – Yishai