java – 在UNix盒子上运行速度慢但在Windows上运行速度快的递归
我有一个
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或远程呼叫导致不必要的延迟. 问题在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,混合模式) 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框中的此参数,JVM被推送到解释模式:-Djava.compiler = NONE (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |