有没有人知道为什么Grails应用程序在tomcat(6和7)中的运行速度比通过grails run-app
慢4倍?否则,我将不胜感激关于如何自己追踪这一点的一般建议。
A. 情况
我有一个Web应用程序,可以执行一些相当密集的XML处理(解析,xpath,序列化)。 对于大型输入,通过 grails dev run-app
运行时返回结果需要 ~5 秒)。
当我在 tomcat6 中运行相同的应用程序时,速度会慢 4 倍!
grails dev war
cp target/app.war /path/to/tomcat[6|7]/webapps
相同的应用程序、相同的环境、相同的机器:响应相同的 POST 需要 4 倍的时间(20 秒)。
- tomcat中没有记录任何错误;只有我期望的日志输出
- Tomcat 在非调试模式下运行(Ubuntu 13.04 默认设置 +
-XX:MaxPermSize=512m
) - 相同的爪哇版本
更新
看起来以下内容在 Tomcat 中的运行速度慢了大约 12 倍:
XPathFactory.newInstance().newXPath()
。我,嗯,经常打电话。 好吧,现在已经解决了,但我仍然想知道:
- 是什么原因导致 Tomcat 中的速度如此之慢?
- 我可以采取哪些工具/方法来更容易地发现这一发现?(我做了很多手动调试来解决这个问题。
服务提供程序机制确定将哪个类用作 XPathFactory 的实现。类路径上包含文件META-INF/services/javax.xml.xpath.XPathFactory
的 JAR 文件可以替换 JRE 中的缺省实现。
最有可能的是,在您的情况下,开发和生产环境的类路径是不同的。
要检查使用的实现,您可以打印XPathFactory.newInstance().newXPath().getClass()
。JRE 中的内部实现是com.sun.org.apache.xpath.internal.jaxp.XPathExpressionImpl
。