2

プログラムの起動を高速化しようとしていますが、メソッドの動作が少しおかしいことに気付きました。プログラム自体は、ファイルからポイントを読み取り、レンダリングする軽量 Java ゲーム ライブラリ アプリケーションです。注目すべきメソッドは、ファイルから読み取るメソッドです。

このメソッドの興味深い点は、テスト中に 2 回呼び出したことです。最初の呼び出しは完了するまでに 2837 ミリ秒かかり、2 番目の呼び出しには 1704 ミリ秒しかかかりません。

2 つの呼び出しの違いはごくわずかです。違いは、2 番目の呼び出しでは、ファイルの操作を開始する前にファイルの半分を読み取るのに対し、最初の呼び出しでは開始前に 1 行をスキップすることです。

これは問題の方法です:

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

すべての数値はミリ秒単位です。2 回目の実行では、Sort にかかる時間がほぼ 4 分の 1 になっていることがわかります。並べ替え方法は、実行するたびに同じです。

メソッドが含まれるクラスは、メソッドが呼び出されるたびに新しく作成されます。

ですから、最初の呼び出しが 2 番目の呼び出しよりもほぼ 1 秒長くかかる理由が気になります。

4

1 に答える 1

1

ファイル全体の処理時間の約半分の時間がファイルの半分の処理にかかるという事実から、ほとんどの時間はオブジェクトの作成 (Vertex クラスのインスタンス化) に費やされていると思われます。

ただし、何が起こっているのかを本当に確認する唯一の方法は、プロファイリング ツールを使用することです。

JDK ディストリビューションの一部である JVisualVM から始めます。

于 2013-05-27T14:46:07.257 に答える