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