我遇到了一个非常令人沮丧的问题。我使用 IDE 来开发我的应用程序。我通过 IDE 中的执行时间监控性能,但不幸的是,当我将类导出到 Jar 文件时,它在命令行上的运行速度慢了 7 倍。我检查了我的 JVM 并确保相同的 JVM 链接到两个执行。为命令行分配了更多堆内存。
后来,我使用了一个进程性能监控工具,同时运行了两个应用程序(在 CMD 和 IDE 上)。我注意到除了 CPU 能力之外,这两个进程在所有方面都是相同的。在 IDE 上运行的进程占用了大约 19%-23% 的 CPU 使用率,而在 CMD 上运行的进程占用了大约 6%-11% 的 CPU 使用率。这可以解释为什么在 IDE 上运行所需的时间更少。
为了使应用程序清晰,下面是花费大部分时间的代码
for (Call call: calls {
CallXCD callXCD = call.getCallXCD();
if(callXCD.isOnNet()){
System.out.println("OnNet");
}
else if (callXCD.isXNet()){
System.out.println("XNet");
}
else if (callXCD.isOthers()){
System.out.println("Others");
}
else if (callXCD.isIntra()){
System.out.println("Intra");
}
else {
System.out.println("Not Known");
}
}
CallXCD 是一个包含多个字符串变量和几个方法(如 isOnNet 和 isXNet)的对象。这些方法将 compareTo() 方法应用于对象的字符串,并根据此比较返回 true 或 false。
我通过打印每次迭代花费的时间来分析这段代码。在 IDE 中,每次迭代大约需要 0.007 毫秒,而在命令行中运行 jar 文件大约需要 0.2 毫秒。因为我的代码对此进行了大约 400 万次迭代,所以对性能的负面影响非常显着
为什么会这样?。有没有办法像内存参数一样为 JVM 分配更多的处理能力。