2012-10-26 23 views
14

Tôi có thể sử dụng nguyên thủy trong Scala không?Làm thế nào tôi có thể sử dụng nguyên thủy trong Scala?

Trường hợp sử dụng là để lưu trữ hàng tỷ ints, do đó, sự khác biệt giữa 4 byte (cho một int) và 16 byte (cho một số nguyên) là rất quan trọng.

+6

scala biên dịch nguyên thủy khi có thể (Array [Int] => int [] v.v.) – Arjan

+0

Nếu bạn có hàng tỷ ints, bạn có thể gặp vấn đề về bộ nhớ ngay cả khi bạn sử dụng nguyên thủy, cộng với kích thước mảng được giới hạn trên JVM bằng cách cần một int ref cho phần tử ie ~ 2bn elems. Hãy nghĩ đến việc truyền trực tuyến dữ liệu của bạn hoặc sử dụng cơ sở dữ liệu thay thế. –

Trả lời

14

Nếu bạn muốn Scala để lưu trữ nguyên thủy không có hộp bọc, bạn có thể sử dụng Array[Int] nhưng kiềm chế không sử dụng bất kỳ phương pháp thu thập mát Scala vào nó (vì nó sẽ buộc đấm bốc).

Nếu bạn tìm kiếm các bộ sưu tập nguyên thủy bất biến, bạn có thể xem Debox, cung cấp Bộ đệm, Bộ và Bản đồ chuyên biệt. Dự án vẫn đang phát triển nhưng nó rất hứa hẹn.

+0

Tôi không nghĩ rằng việc gọi các vùng chứa Debox không thay đổi là chính xác. Tuy nhiên, Debox cố gắng hết sức để cung cấp các tính năng của Scala mutable.Buffer, Map và Set (ví dụ: autogrowing), với hiệu suất tốt và đặc biệt là không có boxing. –

12

Bạn có thể sử dụng chú thích @specialised để cho trình biên dịch tạo các phiên bản đặc biệt của một lớp cho bạn. Xem this article.

class Container[@specialized(Int) T](value: T) { 
    def apply(): T = value 
} 
Các vấn đề liên quan