Настройка производительности: чтение тела запроса сервлета - PullRequest
0 голосов
/ 18 марта 2011

У нас проблема с производительностью в нашем приложении, особенно когда клиент браузера отправляет на сервер большой объем данных POST.

Узким местом является чтение тела запроса сервлета в Stringbuffer, что у нас естьнаблюдаемые моменты времени более 10 секунд для больших запросов: ( 800 - 1400 КБ - что, с точки зрения браузеров, переводится во что-либо между 800 000 - 1 500 000 символов)

        StringBuilder strBuilder = new StringBuilder(2 ^ 19);
        InputStreamReader isr = new InputStreamReader(request.getInputStream());
        BufferedReader bufReader = new BufferedReader(isr);
        char[] charBuffer = new char[2 ^ 19];

        for (int readCount = bufReader.read(charBuffer); readCount > -1; readCount = bufReader.read(charBuffer))
        {
            strBuilder.append(charBuffer, 0, readCount);
        }

Несколько замечаний:

  • Переменная 'reader' в приведенном выше примере кода соответствует javax.servlet.ServletRequest class
  • Изначально буфер charразмер был в 128 , и StringBuilder без аргументов.
  • Впоследствии я увеличил это значение до 2 ^ 19 , чтобы минимизировать количество итераций и изменение размера внутреннего буфера символов, используемого StringBuilder для больших запросов ввода (для примеров, подробно описанных выше)

Да, у меня есть ноющее чувство, что за этой проблемой могут скрываться проблемы с масштабируемостью :-).Однако, прежде чем переоценивать дизайн приложения, я хотел бы знать, есть ли какие-либо оптимизации вокруг этого блока кода, которые я мог бы попробовать.

Любые предложения будут высоко оценены.

Ответы [ 2 ]

2 голосов
/ 18 марта 2011

У вас уже есть неявный буфер благодаря BufferedReader, но вы читаете из этого в другой буфер (char[]) перед добавлением к StringBuilder. Просто прочитайте по одному char за раз из BufferedReader и добавьте его. Я считаю, что размер буфера по умолчанию для BufferedReader составляет 8 КБ, поэтому вы всегда можете попробовать другой размер, чтобы посмотреть, поможет ли это. Вы проверили количество времени, проведенного в GC?

0 голосов
/ 25 марта 2011

Ответ глядел на меня все время ...

2 ^ 19 компилируется в 17 - так как это битовый оператор исключающего ИЛИ , а не смещенный влево сдвиг: -)

Вероятно, здесь есть какой-то урок, но я не уверен, какой именно - эмпирический анализ эффективности рецензирования или предостережения против позднего кодирования - я еще не решил.

Может послужить полезным Java Puzzler, Нил Гафтер, если вы читаете это!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...