我们的应用程序存在性能问题 - 尤其是当浏览器客户端向服务器提交大量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);
}
需要注意的一些要点:
是的,我有一种唠叨的感觉,这个问题背后可能存在更大的可扩展性问题:-)。
但是,在重新评估应用程序的设计之前,我想知道是否有任何关于此代码块的优化,我可以尝试。
我们非常感谢任何建议。
答案 0 :(得分:2)
由于BufferedReader
,您已经有了一个隐式缓冲区,但是在追加到char[]
之前,您正在读取另一个缓冲区(StringBuilder
)。只需从char
一次阅读一个BufferedReader
并附加即可。我相信BufferedReader
的默认缓冲区大小是8K,因此您可以尝试不同的大小来查看是否有帮助。您是否检查过在GC中花费的时间?
答案 1 :(得分:0)
答案一直瞪着我......
2 ^ 19 汇编成 17 - 因为它是按位异或运算符,而不是左移符号: - )< / p>
这里可能有一个教训,不确定哪个 - 对同行评审效果的实证分析,或对深夜编码的警告 - 我还没有下定决心。
可能是一个有用的Java Puzzler,Neal Gafter,如果你正在读这个!