java - 第二种方法调用比第一种方法花费的时间少得多

标签 java performance memory-management file-io benchmarking

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

相关文章:

java - Java中最快的递归逃脱

iphone - iOS 4 阻止并保留计数

python - 我是否需要手动销毁对象(例如像素图)?

c - 如何在 C 中以可移植的方式管理内存对齐和通用指针算术?

java - 在 Java 进程中运行 Python 脚本时出现语法错误

java - 将 JWT 与 Google App Engine 结合使用

java - Cassandra nodetool抛出java异常

java - 使用 JNI 的 Java 代码流

c - 处理器是否具有首先针对或主要针对 C/C++ 语言的优化和架构偏好?

python - numpy vs Matlab 速度 - arctan 和 power