2012-04-26 32 views
10

Tôi đang làm việc trên một dự án (ở Scala), nơi tôi có nhu cầu thao tác một số lượng rất lớn; quá lớn để được thể hiện bằng các loại tích phân. Java cung cấp các lớp BigInteger và BigDecimal (và scala cung cấp một wrapper mỏng đẹp xung quanh chúng). Tuy nhiên, tôi nhận thấy rằng các thư viện này chậm hơn đáng kể so với các thư viện chính xác tùy ý khác mà trước đây tôi đã sử dụng (ví dụ: http://www.ginac.de/CLN/) và chênh lệch tốc độ có vẻ lớn hơn những gì có thể được quy cho ngôn ngữ.Thư viện chính xác tùy ý JVM

Tôi đã thực hiện một số thông tin về chương trình của mình và 44% thời gian thực hiện đang được sử dụng trong phương pháp nhân BigInteger. Tôi muốn tăng tốc độ chương trình của tôi một chút, vì vậy tôi đang tìm kiếm một lựa chọn nhanh hơn và hiệu quả hơn so với lớp BigInteger (và trình bao bọc Scala của nó). Tôi đã xem xét LargeInteger (từ JScience) và Aint (từ Afloat). Tuy nhiên, cả hai dường như hoạt động chậm hơn so với lớp BigInteger tiêu chuẩn.

Có ai biết thư viện toán học chính xác tùy ý Java (hoặc có sẵn trên JVM) có tập trung vào phép nhân và phép cộng số nguyên hiệu suất cao không?

+0

Dường như có một số trải nghiệm tốt ở đây http://stackoverflow.com/questions/277309/java-floating-point-high-precision-library – thoredge

+0

Cảm ơn bạn. Tuy nhiên, tôi đã nhìn thấy câu hỏi này và đã thử cả thư viện JScience và AFloat (như tôi đã nói, có vẻ chậm hơn BigInteger). Điều này có thể là do số của tôi nằm trong vùng hoàng hôn về kích thước (~ 1500 chữ số). Dù bằng cách nào, tôi biết các hoạt động có thể nhanh hơn nhiều (như mã C++ đạt được điều này). Bên cạnh sự khác biệt ngôn ngữ, khả năng thay đổi (so với Java implable không thay đổi) cũng có thể được chơi. – nomad

Trả lời

1

Thật không may, tôi nghĩ bạn không may mắn cho thư viện gốc Java. Tôi đã không tìm thấy một. Tôi khuyên bạn nên gói GMP, có hiệu suất chính xác tùy ý tuyệt vời, sử dụng JNI. Có JNI trên đầu, nhưng nếu bạn đang ở trong phạm vi 1500 chữ số, mà nên được nhỏ so với sự khác biệt trong phức tạp thuật toán. Bạn có thể tìm thấy bao bì khác nhau của GMP cho Java (Tôi tin rằng một trong những phổ biến nhất là here).

+0

Cảm ơn Rex. Tôi sẽ chấp nhận câu trả lời này b/c có vẻ như âm thanh. Tuy nhiên, có vẻ như b/c tôi đang tạo ra một số lượng lớn các số nguyên lớn, chi phí JNI và JVM/phân bổ đối tượng gốc thực sự đang giết tôi ở đây; dẫn đến hiệu suất kém hơn so với BigInteger của Java. – nomad

+0

@nomad - Bạn cần sử dụng lại các số nguyên. GMP có thể làm điều này, và Scala có thể cung cấp cho bạn các hoạt động đối số cập nhật-và-trả về-trái-tay-có thể giúp ích cho vấn đề tái sử dụng. Xem chương trình Scala "pidigits" sử dụng GMP trong Trò chơi đánh giá ngôn ngữ máy tính để biết cách thực hiện điều này. (Tôi không tuyên bố rằng đây là trang nhã nhất, nhưng ít nhất cũng có thể hoàn toàn khả thi.) –

2

Tôi hơi muộn ... tôi chỉ biết thư viện apfloat, có sẵn trong cả C++ và Java. Apfloat-Library:

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