2010-03-15 6 views
9

Qual è l'utilizzo della memoria e delle prestazioni rispetto alla creazione di un oggetto con un solo costruttore?C'è un colpo di memoria e prestazioni preso dall'uso di Pattern Builder di Bloch?

L'utilizzo qui è nella creazione di un Set<Object> o List<Object> che può contenere più di un milione di voci e mi preoccupo del sovraccarico dell'utilizzo del modello di builder di Bloch. L'ho usato in passato, ma mai in questo grande ambito.

Riferimento: Item 2: Consider a builder when faced with many constructor parameters, ristampato in Creating and Destroying Java Objects: Part 1, estratto da Effective Java Second Edition di Joshua Bloch.

+0

Potete aggiungere un collegamento al modello di builder di Bloch? (es. descrizione originale di Bloch) – Roman

+0

Puoi trovare il modello di costruttore di Bloch nel libro Java efficace o @ http://rwhansen.blogspot.com/2007/07/theres-builder-pattern-that-joshua.html – chburd

+0

@chburd: I ho notato anche questo primo link in google, ma dubito che sia la descrizione originale del Bloch. – Roman

risposta

7

Hai l'oggetto Builder aggiuntivo, che viene scartato dopo la creazione dell'oggetto. Quindi potresti avere un impatto sull'uso e sulla velocità della memoria. Ma Java-VM ottimizza molto, specialmente il Server-VM (java -server), quindi la VM può ottimizzare completamente il builder. Quindi il mio suggerimento è che dovresti misurare l'impatto reale (come sempre se ti interessi delle prestazioni) e decidere se l'impatto è troppo grande.

+0

+1, è un test non banale da costruire, ma lo farò. Non ho il controllo su ciò che viene usato JVM, quindi cercavo delle generalità. – WolfmanDragon

2

È difficile da capire dalla descrizione iniziale, ma se si è preoccupati di passare un Collection<Object> con un milione di voci a un costruttore o un costruttore, il costo di un oggetto aggiuntivo (di breve durata) vale la pena di discuterne .

+0

Penso che crei i milioni di oggetti con il modello di costruzione. Ciò significa per ogni milione di oggetti e oggetti di costruzione temporanei aggiuntivi. – Mnementh

+0

Probabilmente potrebbe semplicemente aggiungere un metodo .clear() o qualcosa al generatore ogni iterazione per svuotare il suo contenuto. –

1

Il costo è trascurabile poiché il riferimento del builder può essere raccolto automaticamente dopo la creazione dell'oggetto.

L'impatto della creazione di 1 m di oggetti aggiuntivi deve essere inferiore a 10 secondi in qualsiasi circostanza.

+0

In realtà mi aspetterei meno di 1s, anche su un netbook medio o uno smart phone di classe superiore. – sfussenegger

+0

@sfusseneger: Yeap, ho creato oggetti da 1m in un semplice ciclo for e mi ci sono voluti circa 400 ms ... Penso che 10 s dovrebbero coprire tutti i casi ma sono d'accordo con te. – OscarRyz

+0

Probabilmente questo non è un buon test poiché richiede un po 'di tempo alla JVM per riscaldarsi e ottimizzare. Il codice verrà eseguito un po 'più lentamente mentre viene ottimizzato. – spierce7

Problemi correlati