性能调优:读取servlet请求体

时间:2011-03-18 13:32:23

标签: performance servlets java-ee

我们的应用程序存在性能问题 - 尤其是当浏览器客户端向服务器提交大量POST数据时。

瓶颈在于将servlet请求体读入Stringbuffer - 对于大量请求,我们观察到时间超过10秒:( 800 - 1400 KB - 从浏览器的角度来看,它转化为任何东西 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
  • 最初,char缓冲区大小为 128 ,而no-arg为StringBuilder。
  • 我随后将其增加到 2 ^ 19 以最小化迭代次数,并调整StringBuilder用于大型输入请求的内部字符缓冲区(对于上面详述的示例)

是的,我有一种唠叨的感觉,这个问题背后可能存在更大的可扩展性问题:-)。

但是,在重新评估应用程序的设计之前,我想知道是否有任何关于此代码块的优化,我可以尝试。

我们非常感谢任何建议。

2 个答案:

答案 0 :(得分:2)

由于BufferedReader,您已经有了一个隐式缓冲区,但是在追加到char[]之前,您正在读取另一个缓冲区(StringBuilder)。只需从char一次阅读一个BufferedReader并附加即可。我相信BufferedReader的默认缓冲区大小是8K,因此您可以尝试不同的大小来查看是否有帮助。您是否检查过在GC中花费的时间?

答案 1 :(得分:0)

答案一直瞪着我......

2 ^ 19 汇编成 17 - 因为它是按位异或运算符,而不是左移符号: - )< / p>

这里可能有一个教训,不确定哪个 - 对同行评审效果的实证分析,或对深夜编码的警告 - 我还没有下定决心。

可能是一个有用的Java Puzzler,Neal Gafter,如果你正在读这个!