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?
Trả lời
người here đã so boolean[]
để BitSet
và kết luận với:
BitSet
là nhiều bộ nhớ hiệu quả hơnboolean[]
trừ rất kích thước nhỏ. Mỗiboolean
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 choBitSet
, 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ệuboolean[]
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 Spark và Eclipse 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ế.
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.
Có thể giới thiệu Javolution một, thực sự thực hiện –
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.
Tại sao không sử dụng ints chỉ dài 32 bit? – rreyes1979
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. –
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ó một số lựa chọn thay thế được nén cho lớp BitSet. EWAH đã được đề cập (https://github.com/lemire/javaewah).Những bổ sung gần đây hơn bao gồm bitmap Roaring (https://github.com/RoaringBitmap/RoaringBitmap) được sử dụng bởi Apache Lucene, Apache Spark, Elastic Search, v.v.
- 1. Hiệu suất của phương thức STL bitset :: count() là gì?
- 2. Hiệu suất mảng PHP
- 3. Hiệu suất của StackFrame như thế nào?
- 4. Hiệu suất trình giả lập Android so với hiệu suất thiết bị thực như thế nào?
- 5. Java vấn đề hiệu suất với LinkedBlockingQueue
- 6. Hiệu suất mảng 2 chiều so với mảng 1 chiều
- 7. Hiệu suất của Java Enums?
- 8. Java BitSet cho phép dễ dàng ghép nối BitSets
- 9. Lưu java BitSet vào DB
- 10. So sánh hiệu suất mảng mảng so với mảng đa chiều
- 11. Chuỗi vs mảng byte, Hiệu suất
- 12. Ví dụ về Java BitSet
- 13. Hiệu suất vòng lặp Java
- 14. Lịch sử hiệu suất Java
- 15. Java Đo lường hiệu suất
- 16. Hiệu suất Java 64 bit
- 17. Hoạt động Scala với hiệu suất mảng (plugin scalacl)
- 18. mysql như hiệu suất tăng
- 19. Hiệu suất của marshaller Java
- 20. Hiệu suất bắt ngoại lệ StopIteration như thế nào?
- 21. Hiệu suất của Java ResourceBundle
- 22. Trường bit so với Bitset
- 23. Hiệu suất CALayer so với hiệu suất UIImageView
- 24. Cuộc gọi phương thức ảnh hưởng đến hiệu suất trong Java như thế nào?
- 25. Hiệu suất kém với danh sách Java lớn
- 26. boolean [] và BitSet: Cái nào hiệu quả hơn?
- 27. z-index, ảnh hưởng đến hiệu suất như thế nào?
- 28. Hiệu suất Java trong thuật toán số
- 29. Thay thế hiệu năng cho chuỗi trong Java
- 30. Hiệu suất của ArrayList
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
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?" –
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