2014-12-25 19 views
6

Supponiamo che la mia applicazione utilizza un sacco di Move oggetti più e più volte durring un lungo periodo di tempo, in cui Move è definito come segue:casi riutilizzo delle classi case

sealed trait Player 
case object P1 extends Player 
case object P2 extends Player 
case object P3 extends Player 
case object P4 extends Player 

sealed trait Key 
case object Up extends Key 
case object Down extends Key 
case object Right extends Key 
case object Left extends Key 
case object Space extends Key 

sealed trait Action 
case object Press extends Action 
case object Release extends Action 

case class Input(key: Key, action: Action) 
case class Move(input: Input, player: Player) 

Ecco 10 diverse possibili Input s, e 40 diverso Move s. C'è un modo per chiedere al compilatore di ottimizzare questi tipi creando tutti i possibili Move s una volta e riutilizzando le istanze nel tempo?

risposta

4

È possibile utilizzare uno scalaz Memo:

val moveCache = Memo.mutableHashMapMemo{ip: (Input, Player) => Move(ip._1, ip._2)} 
.... 
val myMove = moveCache((myInput, myPlayer)) 

Onestamente ho molto dubbio che questo avrebbe un impatto significativo sulle prestazioni. Prima di rendere il tuo codice meno leggibile, assicurati di avere risultati di profilazione chiari che dimostrino che ciò fa davvero la differenza.

+3

L'assegnazione di oggetti su un moderno GC generazionale è * estremamente * veloce. Più veloce di 'malloc', ugualmente veloce come lo stack allocation. Anche la raccolta dei rifiuti di piccoli oggetti immutabili di breve durata è estremamente veloce. Con il pooling degli oggetti o il caching, in pratica rompi le ipotesi che rendono GC veloce in primo luogo: prolunghi artificialmente la loro durata (rendendole non più a breve termine), introduci un oggetto gigante ancora più longevo (la cache o il pool stesso) e, in base al tuo caso d'uso, puoi anche rendere gli oggetti mutabili che altrimenti non avrebbero bisogno di essere riutilizzati in uno stato diverso. –

+1

Oppure, per dirla in breve: +1, misura prima, taglia dopo! –

Problemi correlati