重用案例类的实例

Oli*_*ain 6 memory-management scala case-class

假设我的应用程序Move在很长一段时间内反复使用了很多对象,其Move定义如下:

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)
Run Code Online (Sandbox Code Playgroud)

这是10种不同的可能的Inputs和40种不同的Moves.有没有办法要求编译器通过创建所有可能的Moves一次并重新使用实例来优化这些类型?

lmm*_*lmm 4

你可以使用 scalaz Memo

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

老实说,我非常怀疑这会对性能产生重大影响。在降低代码的可读性之前,请确保您有清晰的分析结果,表明它确实产生了您认为的差异。

  • 现代分代 GC 上的对象分配“极其”快。比“malloc”更快,与堆栈分配同样快。短命的小型不可变对象的垃圾收集也非常快。使用对象池或缓存,您基本上首先打破了使 GC 快速的假设:您人为地延长了它们的生命周期(使它们不再短暂),您引入了一个寿命更长的巨型对象(缓存或池本身) ,并且根据您的用例,您还可以使对象可变,否则不需要在不同的状态下重用它们。 (3认同)