Некоторые проверки работоспособности конверта:
- Вы отправляете 233 * 1M байт = 1.864 Гб через сокет, это займет
разное количество времени в зависимости от вашей пропускной способности и сетевой карты, но для
набросать некоторые исходные цифры, если вы получили нужную карту на 100 Мб
за 20 секунд до того, как вас поразит реальная задержка в сети. В действительности это может быть намного выше, если вы не используете localhost или не используете отличное оборудование и возможности подключения.
- Кодирование 233 байтов в строку занимает примерно 260 нс (на моей машине) с использованием новой строки (байты []), поэтому вы смотрите на 1M * 0,25us = 250 миллис.
Таким образом, байты в String не проблема, и я также думаю, что StringBuilder.append не так уж и плох (он копирует массив char в). Вы будете использовать большое количество памяти для всех этих строк и байтовых буферов, и это может привести к некоторому замедлению. Чтобы избежать оттока памяти, вы можете использовать Charset.newDecoder, чтобы получить декодер (сохранить и повторно использовать) и записать ByteBuffer, который вы отключили, непосредственно в многоразовый CharBuffer. Вы упоминаете о некотором форматировании строк, это может быть дорогостоящим, если сделано неправильно, но если вы не делаете что-то сложное, я не думаю, что это проблема.
Более вероятная причина вашей проблемы - сетевая задержка, вы можете проверить эту теорию, написав фиктивную программу, которая просто читает данные и выбрасывает их.
Другой вероятный подозрение - часть вашего кода, которая записывает данные в файл или на диск, но без дополнительной информации трудно помочь.
Кроме того, если вы новичок в профилировании, вы можете использовать ручную синхронизацию для проверки своих теорий:
long start = System.nanotime();
process(data);
long took = System.nanotime() - start;
Подведите итог, сколько времени вы провели в процессе, и у вас есть представление о том, куда ушло время.