加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

java – 在UNix盒子上运行速度慢但在Windows上运行速度快的递归

发布时间:2020-12-15 02:11:38 所属栏目:Java 来源:网络整理
导读:我有一个 java代码,它是while循环和递归的组合.我们面临的问题是,对于unix盒[HP ProLiant BL460c G7]而言,调用以下方法需要的时间几乎是 Windows盒[Intel Xeon CPU E5-1650,64位Windows 7]的8倍.关于如何在Unix框中改进执行时间的任何想法. 我们正在使用JDK
我有一个 java代码,它是while循环和递归的组合.我们面临的问题是,对于unix盒[HP ProLiant BL460c G7]而言,调用以下方法需要的时间几乎是 Windows盒[Intel Xeon CPU E5-1650,64位Windows 7]的8倍.关于如何在Unix框中改进执行时间的任何想法.
我们正在使用JDK 1.6_43 [64位]

protected Date abc(int n,Date date) 
{
    long tStart = System.currentTimeMillis();

    if (n > 0) 
    {
          while (n > 0)
          {
                --n;
                date = getNextExchangeDateUnadjusted(date);
          }

          return date;
    }
    else 
    {

          Date nextExchangeDate = getNextExchangeDateUnadjusted(date);

          Date previousExchangeDate = getNextExchangeDateUnadjusted(date);

          while (!abc( -n + 1,previousExchangeDate).equals(nextExchangeDate)) 
          {

                date = date.addDays( -14);

                previousExchangeDate = getNextExchangeDateUnadjusted(date);

          }

          return previousExchangeDate;
    }
}

编辑:

以下是上面调用的getNextExchangeDateUnadjusted方法的代码

public Date getNextExchangeDateUnadjusted(Date date) {
    // Third Wednesday of each month
    Date thirdWednesdayInMonth = date.getThirdWednesdayInMonth();
    if (thirdWednesdayInMonth.after(date)) {     
      return thirdWednesdayInMonth;
    }
    return date.addMonths(1).getThirdWednesdayInMonth();
  }
}

还想添加该代码在此部分中花费最多时间:

while (!abc( -n + 1,previousExchangeDate).equals(nextExchangeDate)) 
      {

            date = date.addDays( -14);

            previousExchangeDate = getNextExchangeDateUnadjusted(date);

      }

EDIT2:

随着进程的推进,我们在Unix机器上进行了多次堆转储,发现“保留堆”从大约1mb开始增长到450mb,因此堆栈大小正在大幅增长.不确定这是否会导致性能下降.我们现在将在Windows中进行堆转储,并且还将尝试使用XSS更改堆栈大小.

解决方法

采用多管齐下的方法来解决这个问题:

>我们排除了任何IO或远程呼叫导致不必要的延迟.
>通过Visual VM获取堆转储,以查看流程中的任何异常行为,并在Unix和Windows之间进行比较.我们在这里可以追溯到的主要线程占用了4.5mb的堆栈空间,但在Unix和Windows中它都是相同的.
>现在只剩下选项是查看JVM在unix和windows上是否存在任何差距,以及2之间是否存在任何优化差距.

问题在3部分中被发现,以下是我们运行命令java -version时的差距

>在Windows上

java版“1.6.0_43”

Java(TM)SE运行时环境(版本1.6.0_43-b01)

Java HotSpot(TM)64位服务器VM(内置20.14-b01,混合模式)
>在Unix上

java版“1.6.0_43”

Java(TM)SE运行时环境(版本1.6.0_43-b01)

Java HotSpot(TM)64位服务器VM(版本20.14-b01,解释模式)

您可以在unix和windows之间看到JVM热点模式的明显差异.在进一步调查中,我们发现在Interpreted中运行的JVM没有优化代码[本文有详细介绍:https://blog.codecentric.de/en/2012/07/useful-jvm-flags-part-1-jvm-types-and-compiler-modes/].
所以我们在Unix机器上启动了我们的进程,标志为-Xmixed,这迫使JVM在混合模式下工作.这解决了我们的问题,Unix和Windows性能变得相同.

编辑:

由于unix框中的此参数,JVM被推送到解释模式:-Djava.compiler = NONE

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读