2015-06-02 16 views
6

Chúng tôi có một lớp có nhiều phiên bản và gặp sự cố về bộ nhớ. Vì vậy, chúng tôi cố gắng giảm bớt các yêu cầu về bộ nhớ của lớp này. Một ý tưởng sẽ là như sau.tối ưu hóa vi mô java: kết hợp tập các biến cá thể boolean thành bit vectơ dựa trên int

Lớp này có nhiều biến đối tượng boolean, mỗi biến sẽ mất một từ trong quá trình triển khai chưa được thực hiện. Người ta có thể nghĩ đến việc kết hợp chúng với một vector bit nhỏ được lưu trữ trong một int, sao cho yêu cầu bộ nhớ kết hợp của chúng là một từ.

Nhưng tôi nghi ngờ rằng máy ảo Java đang thực hiện tối ưu hóa này dù sao, như vậy thực hiện nó bằng tay sẽ không nhận được bất kỳ khoản tiết kiệm bổ sung nào. Đúng?

+0

Hãy chính xác hơn về * số lượng lớn các trường hợp * - tất cả chúng có nằm trong bộ nhớ cùng một lúc hay bạn chỉ cần thực hiện (và loại bỏ) nhiều và có bao nhiêu người đang nói đến hàng nghìn? Meeelions ?? Hãy chính xác hơn về * nhiều biến đối tượng boolean * - bao nhiêu biến? – OldCurmudgeon

Trả lời

4

Một boolean sử dụng 1 byte bộ nhớ (trên hotspot). Bạn có thể sử dụng giải pháp thay thế:

  • một BitSet: sử dụng khoảng 1 bit cho mỗi boolean + overhead của lớp mình, các tham chiếu đến BitSet, tham chiếu đến long[] trong BitSet và không gian sử dụng trong long[], tức là khoảng 20 byte
  • một int nơi mà mỗi bit là một boolean để lưu trữ 32 boolean trong 4 byte
  • một chặng đường dài trong đó mỗi bit là một boolean để lưu trữ 64 boolean trong 8 byte

Các JVM là khó xảy ra để thực hiện tối ưu hóa đó cho bạn (hotspot 8 không).

+0

Vì vậy, để tiết kiệm bộ nhớ bằng cách sử dụng BitSet yêu cầu ít nhất 20x8 = 160 bit. Đó là rất nhiều bit cho một lớp duy nhất. Vâng, sau đó tôi nén chúng bằng tay –

+1

@UlrichScholz Nó phụ thuộc vào số lượng booleans bạn có - nếu bạn có ít hơn 64 của chúng, thì int và long là các lựa chọn tốt nhất - nhưng nếu bạn có hàng nghìn boolean, chi phí của một BitSet sẽ là một tỷ lệ nhỏ hơn nhiều trong tổng số bộ nhớ được sử dụng bởi các boolean. – assylias

5

JVM sẽ không làm điều đó cho bạn. Kích thước thực tế trong bộ nhớ đang được sử dụng cho mỗi boolean thường là khoảng một byte, nhưng nói chung, nó phụ thuộc vào JVM.

Nếu bạn có nhiều biến boolean, bạn nên suy nghĩ về việc sử dụng một BitSet, được thiết kế để sử dụng các bit để biểu diễn các giá trị boolean.

Xem Javadoc để tham khảo:

http://docs.oracle.com/javase/7/docs/api/java/util/BitSet.html

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