我正在尝试加快我的程序的启动速度,并注意到我的方法有点奇怪。该程序本身是一个轻量级 Java 游戏库应用程序,它从文件中读取点并进行渲染。注意的方法是从文件中读取的方法。
这个方法令人好奇的是我在测试期间调用了它两次,第一次调用需要 2837 毫秒才能完成,第二次只需要 1704 毫秒。
这两个调用之间的差异很小。不同之处在于第二次调用在开始对文件进行任何操作之前读取了一半的文件,而第一次调用在开始之前跳过了一行。
这是有问题的方法:
private void initData(final int type) throws IOException {
final List<Vertex> top = new ArrayList<Vertex>();
final List<Vertex> bot = new ArrayList<Vertex>();
final BufferedReader input = new BufferedReader(new FileReader(location));
if(type == 1) {
while (!input.readLine().contains("lens"));
} else {
input.readLine();
}
while (input.ready()) {
final Scanner in = new Scanner(input.readLine());
while (in.hasNextFloat()) {
final float x = in.nextFloat();
final float y = in.nextFloat();
top.add(new Vertex(x, y, in.nextFloat()));
bot.add(new Vertex(x, y, in.nextFloat()));
in.nextFloat();
}
if ((in.findInLine("[lens]") != null)
|| (in.findInLine("[thin]") != null)
|| (in.findInLine("[thick]") != null)
|| (in.findInLine("[end]") != null)) {
break;
}
}
input.close();
final long start = Diagnostics.getCurrentTime();
mergeAndSort(top, bot);
System.out.println("Sort: " + (Diagnostics.getCurrentTime() - start));
}
我从这里得到的输出是:
Sort: 15
Initializing: 2836
Sort: 4
Initializing: 1704
Reading info: 27
所有数字均以毫秒为单位。您会注意到在第二次运行期间排序花费了将近四分之一的时间。每次运行时排序方法都是相同的。
每次调用方法时,方法所在的类都是新创建的。
所以,我很好奇为什么第一个调用比第二个调用多了将近整整一秒。
最佳答案
处理一半文件所用时间大约是处理整个文件所用时间的一半这一事实使我相信大部分时间都花在了对象创建(Vertex 类的实例化)上。
但是,真正确定发生了什么的唯一方法是使用分析工具。
我将从 JVisualVM 开始,它是 JDK 发行版的一部分。
关于java - 第二种方法调用比第一种方法花费的时间少得多,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16775170/