Curiosità ed efficienza sono le ragioni di questa domanda. Mi trovo in una situazione in cui sto creando molti nuovi HashSets dopo alcuni cicli eseguiti:Efficienza memoria di cancellazione di un hashset rispetto alla creazione di un nuovo hashset
Il HashSet è attualmente dichiarato come tali al vertice della categoria:
private Set<String> failedTests;
Poi più tardi nel codice, ho appena creare un nuovo failedTests HashSet ogni volta che sto rieseguire i test:
failedTests = new HashSet<String>(16384);
lo faccio più e più volte, a seconda delle dimensioni del test. Mi aspetto che il garbage collector gestisca in modo più efficiente i vecchi dati. Ma, io so un'altra opzione sarebbe quella di creare il HashSet inizialmente in principio:
private Set<String> failedTests = new HashSet<String>(16384);
e quindi deselezionare la HashSet ogni volta attraverso il ciclo.
failedTests.clear();
La mia domanda è qual è il modo più efficiente per farlo in termini di spese generali, ecc.? Non so cosa stia facendo la funzione clear(): sta facendo la stessa cosa, inviando i vecchi dati alla garbage collection o sta facendo qualcosa di ancora più efficiente? Inoltre, sto dando all'HashSet un grande cuscinetto di capacità iniziale, ma se un test richiede più di 2^14 elementi, la funzione .clear()
sarà nuovamente istanziata da HashSet a 16384?
Per aggiungere, ho trovato il source code to clear() here. Quindi è almeno una operazione O (n) del caso peggiore.
Utilizzando la funzione di cancellazione, ho eseguito un test che ha completato in 565 secondi. Usando il GC per gestirlo, il test è finito in 506 secondi.
Ma non è un punto di riferimento perfetto perché ci sono altri fattori esterni come l'interfaccia con il file system del computer e della rete. Ma un minuto intero sembra davvero piuttosto buono. Qualcuno consiglia uno specifico sistema di profilazione che funzionerà a livello di linea/metodo? (Sto usando Eclipse Indigo)
Hai provato a eseguire il benchmarking? – rob
Hai qualche misura su come * molti * nuovi set stai creando? Hai effettivamente testato il comportamento della tua applicazione? È un caso della domanda * memoria vs prestazioni * che spesso porta a un'ottimizzazione prematura. Come base puoi creare un nuovo 'HashSet', permettere a GC di fare il suo lavoro e fare un po 'di profilazione per vedere i tempi reali prima di preoccuparti. Dopotutto, il metodo 'clear' implica un'iterazione, riferimenti null e permette al GC di fare comunque il suo lavoro. – Gamb
possibile duplicato di [Il modo più veloce per ricreare ArrayList in un ciclo for] (http://stackoverflow.com/questions/11740013/fastest-way-to-recreate-the-arraylist-in-a-for-loop): 'new' è generalmente più veloce di' clear'. – assylias