Servlet请求getParameter方法的性能

3
我注意到我的应用程序有时非常慢,所以我进行了一些测试。 这是一个非常简单的Web应用程序。一个servlet获取一些参数然后存储它们。 除了一件事,一切都很好。第一次获取参数需要太长时间了。无论我尝试获取哪个参数,第一次都很慢。奇怪的是,这并不总是发生。有时候第一次获取参数并不慢。
我的代码看起来像这样:
request.getParameter("paramName");
request.getParameter("paramName2");
request.getParameter("paramName3");

"paramName"获取速度较慢,而其他参数获取速度非常快。

这里的“较慢”指的是:200-800毫秒;而“非常快”指的是:约0毫秒。(在代码片段中,我没有编写性能测试,但我使用了System.currentTimeMillis()

更新:

我将项目导出为.WAR文件,并将其部署到Tomcat。一切正常。因此,我认为这个问题与Eclipse或其他东西有关。

3个回答

2
我怀疑参数可能是惰性解析的-当您首次请求参数时,它可能会解析所有内容,并将它们存储以供以后高效访问。
然而,200毫秒听起来非常长...这是在调试器下运行时吗?
当然,这完全取决于您的Servlet容器。

不,我不是在调试。我正在使用Tomcat 6和Eclipse。只需按下“运行服务器”就可以了。这太奇怪了,我就是弄不明白。200毫秒听起来很长,但通常是600甚至800。 - Bob
1
@Bob:如果这只发生在第一个请求上,那可能是JIT编译了大量的代码。如果每个请求都发生这种情况,我怀疑你的性能测量有问题 - 或者你正在运行486 :) 说真的,如果Tomcat花费600毫秒(甚至只是200毫秒)来解析请求参数,它将无法用于任何严肃的部署。 - Jon Skeet
我也在Jetty中观察到了这一点,实际上我发现很多第一次方法执行都非常缓慢(相对于后续调用),有没有办法让我确认这是因为JIT编译的缘故? - Sudarshan
@Sudarshan:您可能可以使用性能分析API来实现,但是很抱歉我对此不是很了解 :( - Jon Skeet

1

听起来像是Eclipse内置的Web浏览器存在一个bug,它无法正确发送Content-Length头信息。我不能从经验中判断,因为我从未认真使用过它。我总是将项目部署到集成的Tomcat或Glassfish中,启动它,然后在真正的Web浏览器(Firefox、Chrome、Safari、IE等)中打开页面。这有一个重要的好处,你可以使用任何浏览器的插件和附加组件,这些可以极大地简化开发,如Firebug等。

如果你坚持使用Eclipse内置的Web浏览器,请尝试更改Web浏览器,方法是进入窗口 > Web浏览器,选择除内置Web浏览器之外的其他选项。


0

你的内存足够吗?在使用Eclipse和部署服务器时需要大量内存,而且似乎出现了交换。


我的电脑有4GB内存,我已经设置了虚拟机参数:-Xms1024M -Xmx1024M。 - Bob

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接