Нет значительных проблем с производительностью при чтении из BufferedReader
как большими кусками, так и даже одним символом за раз.
Если ваше профилирование не определило метод BufferedReader.read()
как определенную горячую точку вВаш код, лучшее, что вы можете сделать, это сделать код простым и читаемым, а не тратить время на его оптимизацию.
Для вашего конкретного случая:
- да, этот кодэто немного неубедительно, но
- нет, вряд ли это будет иметь большое значение с точки зрения производительности.
Реальным узким местом производительности, скорее всего, является сама сеть.Для решения этой проблемы вы можете сделать что-то на уровне приложения, но в конечном итоге вы можете отправлять / получать данные только со скоростью, поддерживаемой сквозным сетевым соединением.
Мой результат профилирования говорит, что он исходит из: BufferedReader.read ().Что это значит на самом деле?
Вы уверены, что время действительно тратится в методе чтения Socket?Если это так, то реальная проблема заключается в том, что потоки вашего приложения тратят много времени на ожидание сетевых пакетов.Если это так, то единственное, что вы можете сделать, - это уменьшить количество сбросов на стороне клиента и сервера, чтобы сети не приходилось иметь дело с таким большим количеством маленьких пакетов.В зависимости от вашего приложения это может быть неосуществимо.
Я бы написал ваш код следующим образом:
BufferedReader _in = new BufferedReader(
new InputStreamReader(_socket.getInputStream()));
StringBuilder packet = new StringBuilder();
int ch;
while ((ch = _in.read()) != 1) {
if (ch != '\u0000' && ch != '\n' && ch != '\r') {
packet.append((char) ch);
} else if (!packet.isEmpty()) {
parsePlayerPacket(packet.toString());
packet = new StringBuilder();
}
}
Но я не думаю, что это будет многоразница в производительности ... если только "пакеты" обычно не длиннее сотни символов.(Реальная цель моих настроек - уменьшить количество временных строк, создаваемых при чтении пакета. Я не думаю, что есть простой способ сделать так, чтобы он тратил меньше реального времени на вызовы read
.)