Mi sono imbattuto in questo codice (Java) ieri e non riesco a capire perché qualcuno lo avrebbe fatto in qualsiasi lingua.
In quale scenario, linguaggio, delusione paranoica "rimuovendo" i valori da un ArrayList come questo migliorano le prestazioni? Cerca di evitare di essere trascinato nella progettazione generale del lavoratore. So che è brutto e dovrebbe essere diverso, ma sto cercando di capire se c'è un motivo per scrivere un metodo di 'rimozione' in questo modo.
Alcuni punti di chiarimento:
- tradeIdList non contiene valori duplicati
- Viene popolato nel costruttore e non viene mai letto fino a quando l'operatore non ha terminato.
-
La classe che legge questo risultato stampa semplicemente il contenuto in un file di registro.
TradeIdWorker di classe pubblica implementa Runnable { elenco privato tradeIdList = new ArrayList (); ....
public void run(){ // Copy the tradeIdList to an array (No I do not know why) for (int tradeId : tradeIdArray){ .... // Once processed, remove it removeProcessedTradeId(tradeId); } /** * Set Trade id to zero (for performance) */ private void removeProcessedTradeId(int tradeId) { for (int index = 0; index < tradeIdList.size(); index++) { if (tradeIdList.get(index).intValue() == tradeId) { tradeIdList.set(index, 0); } } }
Per cercare di capire perché ho aggiunto un caso d'uso del mondo reale dal sistema. L'arraylist di tradeIds non contiene mai duplicati.
public static void main(String[] args) {
testNormalRemove();
testPerformantRemove();
}
private static void testNormalRemove() {
ArrayList<Integer> aList = new ArrayList<Integer>();
for (int i = 0; i < 1000000; i++) {
aList.add(i);
}
long start = System.currentTimeMillis();
for (int i = 0; i < aList.size(); i += 1000) {
aList.remove((Object) i);
}
long end = System.currentTimeMillis();
System.out.println("Normal Took: " + (end - start)); // 1700ms
}
private static void testPerformantRemove() {
ArrayList<Integer> aList = new ArrayList<Integer>();
for (int i = 0; i < 1000000; i++) {
aList.add(i);
}
long start = System.currentTimeMillis();
for (int i = 0; i < aList.size(); i += 1000) {
for (int index = 0; index < aList.size(); index++) {
if (aList.get(index).intValue() == i) {
aList.set(index, 0);
}
}
}
long end = System.currentTimeMillis();
System.out.println("Performant Took: " + (end - start)); // 4800ms
}