Я разрабатываю Java-загрузчик для двоичных данных. Эти данные передаются через текстовый протокол (UU-encoded). Для сетевой задачи используется Netty-библиотека. Двоичные данные разбиваются сервером на множество тысяч небольших пакетов и отправляются клиенту (то есть приложение Java).
От netty я получаю объект ChannelBuffer
каждый раз при получении нового сообщения (данных). Теперь мне нужно обработать эти данные, помимо других задач мне нужно проверить заголовок пакета, поступающего с сервера (например, строка состояния HTTP). Для этого я вызываю ChannelBuffer.array()
для получения массива byte[]
. Затем этот массив можно преобразовать в строку через new String(byte[])
и легко проверить (например, сравнить) его содержимое (опять же, как сравнение с сообщением статуса "200" в HTTP).
Программное обеспечение, которое я пишу, использует несколько потоков/соединений, так что я получаю несколько пакетов из netty параллельно.
Это обычно прекрасно работает, однако при профилировании приложения я заметил, что когда соединение с сервером хорошо, а данные поступают очень быстро, то это преобразование в объект String
кажется узким местом. В таких случаях использование ЦП близко к 100%, и в соответствии с профилировщиком очень много времени тратится на вызов этого конструктора String(byte[])
.
Я искал лучший способ получить от ChannelBuffer
до String
, и заметил, что у первого также есть метод toString()
. Однако этот метод еще медленнее конструктора String(byte[])
.
Итак, мой вопрос: кто-нибудь из вас знает лучшую альтернативу для достижения того, что я делаю?