Devo implementare il pool di oggetti per le macchine virtuali Dalvik?

3

Questa domanda si estende da queste domande:

Bene, una JVM in esecuzione su un server è ottimizzata, lo so. Programmi come il server Minecraft funzionano senza problemi con un po 'di pausa ogni pochi secondi (è ancora ben oltre i 2-5ms, quindi è ancora abbastanza per alcune applicazioni). Se sto scrivendo app del genere, non avrei problemi a dormire la notte per pensare se dovessi implementare il pool di oggetti per quell'app Java che dovrei fare. Ma questa volta, sto facendo un'app per Android.

La mia app creerà un numero considerevole di POJO, in particolare vector / quat che hanno come primo membro 3/4 primitive doppie (potrebbe tornare a galleggiare se necessario) ogni spunta di gioco 40TPS. Scopo di essi sono algoritmi come l'intersezione del piano di linea, il calcolo dell'accelerazione / velocità e così via. Con un tick potrebbe richiedere O (N * N), dato che l'ottimizzazione verrà eseguita dopo il rilascio dell'app.

Dovrei essere preoccupato per questo? Le macchine virtuali Dalvik considerano le VM con "moden GC"? Il codice della mia app diventerà gonfio dopo questo punto di sviluppo e ho bisogno di decidere se dovrei almeno avvolgere la creazione di Vettori attorno al metodo factory in modo da poter implementare qualcosa come thread-local object pool su di esso in seguito.

Modifica

  • Il livello API di destinazione è 21. Quindi, il titolo è fuorviante. È una domanda su JVM Android
posta Ashe the human 30.01.2018 - 03:45
fonte

1 risposta

1

Probabilmente non iniziare con il pooling di oggetti: prima fallo funzionare, quindi fallo velocemente. Puoi sempre tornare indietro e ottimizzare questo codice più tardi.

Il pooling degli oggetti potrebbe non essere necessariamente una buona ottimizzazione. Porta a un paio di compromessi:

  • Gli oggetti devono essere modificabili in modo che possano essere reinizializzati. Ciò potrebbe impedire l'ottimizzazione automatica e rendere più difficile ragionare il codice.

  • Il pool combatte il GC, il che rende il GC meno efficiente. Con un GC, le allocazioni possono essere molto economiche (molto più economiche che in C / C ++). E la pulizia periodica è in genere anche veloce: la maggior parte degli oggetti ha vita breve, quindi è probabile che siano già morti quando GC li guarda. Al contrario, gli oggetti raggruppati sono fondamentalmente immortali, quindi hanno bisogno di cure extra.

  • Se un oggetto viene usato solo localmente, a volte può essere ottimizzato, come se i membri fossero variabili locali. Una precondizione per questa ottimizzazione è un'analisi di escape, che l'oggetto non sopravvive all'ambito. Il raggruppamento impedisce questo.

  • In un linguaggio non GC, i pool di oggetti di dimensioni fisse hanno il vantaggio di evitare la frammentazione della memoria. Questa non è una considerazione in Java, poiché gli oggetti possono essere spostati.

Quindi i pool di oggetti sono probabilmente un antipattern completo per oggetti economici e di breve durata in un linguaggio GC. E una classe vettoriale è così semplice come si arriva. Invece di superare in astuzia la tua piattaforma, collabora con il runtime e scrivi codice che è facile da ottimizzare. Ad esempio, l'utilizzo delle classi finali semplifica l'ottimizzazione.

È possibile che a un certo punto tu voglia rimuovere queste classi, o almeno ridurne l'uso. Quando non sono ottimizzati, gli oggetti hanno ancora lo svantaggio di un puntatore indiretto e una cattiva localizzazione della memoria. Un approccio "oggetto di matrici" può aiutare (ma condivide alcuni inconvenienti con un pool di oggetti). È anche possibile allineare manualmente il contenuto dell'oggetto, ovvero utilizzare float x1, x2, x3 anziché Vec x .

Se si scopre che la creazione e la pulizia dei vettori influiscono in modo misurabile sulle prestazioni, è possibile testare tali ottimizzazioni rispetto alla linea di base del codice attualmente funzionante. Non puoi eseguire questi test con la stessa facilità se inizi con un codice "ottimizzato".

    
risposta data 03.02.2018 - 18:22
fonte

Leggi altre domande sui tag