2012-01-10 37 views
5

Tôi đang tìm kiếm một giải pháp thay thế cho việc thực thi Java Bitset. Tôi đang thực hiện một thuật toán hiệu suất cao và có vẻ như sử dụng một đối tượng Bitset đang giết chết hiệu suất của nó. Ý tưởng nào?Thay thế cho Java Bitset với mảng như hiệu suất?

+5

Bạn có thể cho chúng tôi biết thêm chi tiết về hoạt động của 'BitSet' xuất hiện để * giết hiệu suất * không? Một đoạn mã ngắn mà bạn đã trình bày để thể hiện sự chậm chạp của nó sẽ là lý tưởng. – dasblinkenlight

+0

Câu hỏi của bạn đúng hơn là "tại sao bitet này lại giết chết hiệu suất của tôi?" - và thông báo rằng tôi đã cho bạn một số tín dụng bằng cách không cho rằng nó nên là "những gì đang giết chết hiệu suất của tôi ở đây?" –

+0

Vâng, một "thay thế" có thể làm các hoạt động bit trên nguyên thủy (dài, int vv) chính mình. Tuy nhiên, như đã nêu bạn nên xây dựng trên các mục tiêu của bạn và vấn đề hiệu suất chính xác. – Thomas

Trả lời

9

người here đã so boolean[] để BitSet và kết luận với:

BitSet là nhiều bộ nhớ hiệu quả hơn boolean[] trừ rất kích thước nhỏ. Mỗi boolean trong mảng mất một byte. Các số điện thoại từ runtime.freeMemory() có một chút lộn xộn cho BitSet, nhưng ít hơn.

boolean[] có hiệu suất CPU cao hơn ngoại trừ các kích thước rất lớn, trong đó chúng thậm chí còn khoảng. Ví dụ: đối với kích thước 1 triệu boolean[] là khoảng bốn lần nhanh hơn (ví dụ: 6ms so với 27 mili giây), cho mười và một trăm triệu , chúng thậm chí còn khoảng.

Nếu bạn Google, bạn có thể tìm thấy một số triển khai thay thế là tốt, như JavaEWAH, được sử dụng bởi Apache Hive, Apache SparkEclipse JGit. Xác nhận quyền sở hữu:

Mục tiêu nén liên kết từ không phải là để đạt được độ nén tốt nhất, mà là để cải thiện thời gian xử lý truy vấn. Do đó, chúng tôi cố gắng tiết kiệm chu kỳ CPU, có thể bằng chi phí lưu trữ. Tuy nhiên, lược đồ EWAH mà chúng tôi đã triển khai luôn hiệu quả hơn so với một bitmap không nén như được triển khai trong lớp BitSet). Không giống như một số lựa chọn thay thế, javaewah không phụ thuộc vào một chương trình được cấp bằng sáng chế.

4

Nhìn vào Javolution FastBitSet: Một bitset hiệu suất cao tích hợp với khuôn khổ bộ sưu tập như một tập hợp các chỉ số và tuân theo bộ sưu tập ngữ nghĩa cho các phương pháp như FastSet.size() (cardinality) hoặc FastCollection.equals (java. lang.Object) (cùng một tập hợp các chỉ mục).

Xem thêm http://code.google.com/p/guava-libraries/issues/detail?id=724#c3.

+0

Có thể giới thiệu Javolution một, thực sự thực hiện –

2

Nếu bạn thực sự phải ép hiệu suất tối đa ra khỏi điều này và nếu bộ nhớ không quan trọng, bạn có thể thử lưu trữ từng cờ trong số nguyên có kích thước bit bằng với chiều rộng của bus dữ liệu của CPU của bạn.

Có thể bạn đang sử dụng CPU bus dữ liệu 64 bit, vì vậy hãy thử các số nguyên dài.

+0

Tại sao không sử dụng ints chỉ dài 32 bit? – rreyes1979

+0

Bởi vì nếu căn chỉnh dựa trên kiến ​​trúc của bạn, thì bạn muốn đi với kích thước chính xác của bus dữ liệu, không còn nữa, không kém. Và các kiến ​​trúc hiện đại thường có các bus địa chỉ 64 bit, chứ không phải 32-bit. Tôi không nói rằng điều này sẽ nhất thiết phải làm việc, vì vậy hãy chắc chắn để chuẩn nó. Nó phụ thuộc vào cách CPU của bạn truy cập bộ nhớ của bạn. –

4

Trong khi tìm kiếm một câu trả lời cho câu hỏi của tôi single byte comparison vs multiple boolean comparison, tôi thấy OpenBitSet

Họ tự xưng là nhanh hơn so với Java BitSet và truy cập trực tiếp đến các mảng các từ lưu trữ các bit.

Tôi chắc chắn sẽ thử điều đó. Xem nếu nó giải quyết mục đích của bạn quá.

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