java - websphere 比 Tomcat 慢得多的原因是什么

标签 java performance tomcat websphere

使用非常基本的 JDK 数学 api 的相同 POJO 代码,与持久层无关,只是 POJO,但是迭代可能进行数百万轮,因此从 Websphere 到 Tomcat 的总时间差可能是 10:1。代码是这样的。

for(int i=0;i<200000;i++){
    logger.info("calculate result 1");
    int result_int1 = new Double(param1_double_left / param1_double_right).intValue();
    logger.info("calculate result 2");
    int result_int2 = new Double(param2_double_left / param2_double_right).intValue();
    logger.info("calculate result 3");
    int result_int3 = new Double(param3_double_left / param3_double_right).intValue();
    logger.info("calculate result 4");
    int result_int4 = new Double(param4_double_left / param4_double_right).intValue();
    logger.info("calculate result 5");
    int result_int5 = new Double(param5_double_left / param5_double_right).intValue();
    //... more calculation with java math like above
}

从 tomcat 的 log4j 日志来看,它非常快,所以时间戳就像

2016-12-05 17:53:31,200 INFO .... <-200
.... another 10 - 20 lines with same timestamp
2016-12-05 17:53:31,201 INFO .... <-201
.... another 10 - 20 lines with same timestamp
2016-12-05 17:53:31,202 INFO .... <-202
.... another 10 - 20 lines with same timestamp
2016-12-05 17:53:31,203 INFO .... <-203
.... another 10 - 20 lines with same timestamp
2016-12-05 17:53:31,204 INFO .... <-204
.... another 10 - 20 lines with same timestamp

来自 websphere 的 log4j 日志,时间戳随着每次激增的时间增加而增加

2016-12-05 17:55:47,197 INFO .... <-197
.... another 10 - 20 lines with same timestamp
2016-12-05 17:55:47,212 INFO .... <-212
.... another 10 - 20 lines with same timestamp
2016-12-05 17:55:47,239 INFO .... <-239
.... another 10 - 20 lines with same timestamp
2016-12-05 17:55:47,251 INFO .... <-251
.... another 10 - 20 lines with same timestamp
2016-12-05 17:55:47,277 INFO .... <-277
.... another 10 - 20 lines with same timestamp

所以只是想知道关于 websphere 缓慢的因素可能是什么。 GC?或其他 JVM 调整?

最佳答案

首先,您通过在每次计算后打印到日志来衡量 log4j 的性能而不是 jdk 数学 API 的性能。如果你想做对,在开始和结束时使用一次 System.currentTimeInMillis() 并打印差异。

其次,当多线程应用程序在线程数多于 CPU 内核时运行(websphere 就是这种情况),线程将需要被调度并轮流运行,这就是为什么您会看到 websphere 消息成批记录的原因。

最后,用 jdk API 的速度来衡量应用服务器的性能没有任何意义。更准确的做法是测量服务器启动时间或请求/秒(tomcat 几乎肯定会在小规模测试中胜出,因为它是轻量级的)。就好比摩托车和半挂卡车,它们在性能上有着不同的优势。

一个更有趣的比较是 tomcat 与 websphere liberty,它是 websphere traditional 的更新更轻量级的版本。

关于java - websphere 比 Tomcat 慢得多的原因是什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40987188/

相关文章:

java - 如何避免异常阴影?

java - 除非先选择 View ,否则 requestDisallowInterceptTouchEvent 不起作用

java - PlayFramework 多个 SLF4J 绑定(bind)

java - 从 Tomcat 7 迁移到 Tomcat 8

java - 如何使用不同的名称而不是本地主机运行 tomcat 服务器

java - Java 编辑器中出现 "Cannot find symbol"错误

C++检查文件是否存在而不打开它?

javascript - Javascript 中的循环时间执行

apache - 在 Tomcat 前面有一个 apache 网络服务器的原因是什么?

android - 混合应用程序在性能上是否优于 native 应用程序