2014-12-25 17 views
6

Giả sử ứng dụng của tôi sử dụng rất nhiều Move đối tượng hơn và hơn durring một thời gian dài, nơi Move được định nghĩa như sau:trường hợp tái sử dụng của trường hợp lớp

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) 

Đó là 10 khác nhau có thể Input s, và 40 khác nhau Move s. Có cách nào để yêu cầu trình biên dịch để tối ưu hóa các loại bằng cách tạo ra tất cả các Move s một lần và tái sử dụng các trường hợp theo thời gian?

Trả lời

4

Bạn có thể sử dụng một scalaz Memo:

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

Thành thực mà nói tôi rất nghi ngờ điều này sẽ có ảnh hưởng đáng kể đến hiệu suất. Trước khi làm cho mã của bạn ít có thể đọc được, hãy đảm bảo bạn có kết quả lược tả rõ ràng cho thấy rằng nó thực sự tạo ra sự khác biệt mà bạn nghĩ.

+3

Phân bổ đối tượng trên GC thế hệ hiện đại là * cực kỳ * nhanh. Nhanh hơn 'malloc', nhanh như phân bổ stack. Việc thu gom rác của các vật thể không thay đổi nhỏ trong thời gian ngắn cũng rất nhanh. Với việc gộp nhóm hoặc lưu trữ đối tượng, về cơ bản bạn đã phá vỡ các giả định làm cho GC nhanh chóng: bạn giả tạo kéo dài tuổi thọ của chúng (khiến chúng không còn tồn tại trong thời gian ngắn), bạn giới thiệu một đối tượng khổng lồ còn sống (cache hoặc pool) và tùy thuộc vào trường hợp sử dụng của bạn, bạn cũng làm cho các đối tượng có thể thay đổi mà không cần phải sử dụng lại chúng ở trạng thái khác. –

+1

Hoặc, để đặt nó ngắn: 1, đo đầu tiên, cắt sau! –

Các vấn đề liên quan