Tôi đang phát triển trình tải xuống dựa trên Java cho dữ liệu nhị phân. Dữ liệu này được truyền qua giao thức dựa trên văn bản (mã hóa UU). Đối với tác vụ nối mạng, thư viện netty được sử dụng. Dữ liệu nhị phân được phân chia bởi máy chủ thành nhiều nghìn gói nhỏ và được gửi tới máy khách (ví dụ: ứng dụng Java).Java: Thay thế nhanh hơn cho chuỗi (byte [])
Từ netty Tôi nhận được đối tượng ChannelBuffer
mỗi lần nhận được một tin nhắn mới (dữ liệu). Bây giờ tôi cần xử lý dữ liệu đó, bên cạnh các nhiệm vụ khác, tôi cần kiểm tra tiêu đề của gói đến từ máy chủ (như dòng trạng thái HTTP). Để làm như vậy, tôi gọi ChannelBuffer.array()
để nhận mảng byte[]
. Mảng này sau đó tôi có thể chuyển đổi thành một chuỗi thông qua new String(byte[])
và dễ dàng kiểm tra (ví dụ: so sánh) nội dung của nó (một lần nữa, như so sánh với thông báo trạng thái "200" trong HTTP).
Phần mềm tôi đang viết đang sử dụng nhiều luồng/kết nối, để tôi nhận nhiều gói từ netty song song. Tuy nhiên, điều này thường hoạt động tốt, tuy nhiên, trong khi lược tả ứng dụng tôi nhận thấy rằng khi kết nối với máy chủ tốt và dữ liệu đến rất nhanh, thì chuyển đổi này thành đối tượng String
có vẻ là một nút cổ chai. Việc sử dụng CPU là gần 100% trong các trường hợp như vậy, và theo profiler rất nhiều thời gian được chi tiêu trong việc gọi hàm xây dựng String(byte[])
này.
Tôi đã tìm kiếm một cách tốt hơn để lấy từ số ChannelBuffer
đến số String
và nhận thấy phương thức cũ cũng có phương thức toString()
. Tuy nhiên, phương pháp đó thậm chí còn chậm hơn so với phương thức khởi tạo String(byte[])
.
Vì vậy, câu hỏi của tôi là: Có ai trong các bạn biết một lựa chọn tốt hơn để đạt được những gì tôi đang làm không?
Tại sao? Chỉ cần gửi các byte, càng nhanh càng tốt. Quên mã uuencoding; quên việc chia tách. TCP đã không tách, và nó biết nhiều hơn về kích thước gói tối ưu trên kết nối hiện tại hơn bạn. – EJP