第二种方法调用所花费的时间远远少于第一种

时间:2013-05-27 14:17:36

标签: java performance memory-management file-io benchmarking

我正在尝试为我的程序加速启动,并注意到我的方法有点奇怪。该程序本身是一个轻量级Java游戏库应用程序,它从文件中读取点并呈现它们。注意的方法是从文件中读取的方法。

这个方法的好奇之处在于我在测试期间调用了两次,第一次调用需要2837ms完成,第二次调用只需要1704ms。

两次通话之间的差异很小。区别在于第二次调用在开始对文件进行任何操作之前读取文件的一半,而第一次调用在开始之前跳过一行。

这是有问题的方法:

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

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

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

所以,我很好奇为什么第一次通话比第二次通话需要的时间长一整秒。

1 个答案:

答案 0 :(得分:1)

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

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

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