Vì vậy, tôi có chương trình Java này mà tôi sử dụng để nhai qua vài terabyte dữ liệu. Hiệu suất là một mối quan tâm.Hiệu quả strtod trong Java?
Tôi đã cấu hình ứng dụng, và một phần lớn của tất cả các cấp phát bộ nhớ cũng như một phần lớn thời gian CPU đến từ thực hiện một thao tác đơn giản:
Tôi có một mảng các ký tự ASCII. Tôi biết rằng các ký tự từ offset i
để bù đắp j
đại diện cho một số dấu phẩy động. Tôi cần trích xuất số dấu phẩy động đó thành double
.
Ngây thơ Double.parseDouble(new String(buf, i, j - i))
thực hiện công việc. Tuy nhiên, đây là nơi rất nhiều thời gian được chi và rất nhiều cấp phát bộ nhớ từ đâu đến, có lẽ vì:
new String()
tạo ra một đối tượng mới, tạo ra một nộichar[]
mảng và bản sao các nhân vật vào mảng;Double.parseDouble()
tạo đối tượngFloatingDecimal
và cũng tạo ra một mảngchar[]
, cũng sao chép các ký tự vào đó.
Tất cả các phân bổ này và tất cả việc sao chép này không thực sự cần thiết. Tôi có thể tránh chúng không?
Những gì tôi thực sự muốn là một chức năng strtod
-like rằng sẽ mất một char[]
(hoặc một byte[]
) cũng như hiệu số bắt đầu/kết thúc, và trả về một double
.
Mọi đề xuất? Tôi có nên tự mình triển khai không? Tôi có nên viết trình bao bọc JNI xung quanh strtod
không? Tôi có nên sử dụng một số thư viện Java đã có ở đó không?
Trên thực tế, phương pháp String.substring không sao chép mảng ban đầu. Nó có thể hữu ích nếu String constructor là một nút cổ chai. –