2

我正在尝试加快程序的启动速度,并注意到我的方法有点奇怪。该程序本身是一个轻量级 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

所有数字都以毫秒为单位。您会注意到,在第二次运行期间,排序花费了将近四分之一的时间。每次运行时,排序方法都是相同的。

每次调用方法时,都会新创建包含方法的类。

所以,我很好奇为什么第一个电话比第二个电话要长将近一秒钟。

4

1 回答 1

1

处理一半文件大约需要处理整个文件一半时间的事实使我相信大部分时间都花在对象创建(Vertex 类的实例化)上。

但是,真正确定发生了什么的唯一方法是使用分析工具。

我将从 JVisualVM 开始,它是 JDK 发行版的一部分。

于 2013-05-27T14:46:07.257 回答