4

Nexus OneタブレットのAndroidでメモリの問題が発生し、洞察を期待していました。

私は64intの配列で表されるボードゲームを作っています。アクティビティのonPause()が呼び出されると、現在のボードと、前のターン(最大64ターン)の各ボードが保存されます。これには約600msかかりますが、問題ありません。onResume()が呼び出され、情報をロードするときは、完全な取り消し履歴で最大35秒かかる場合があります。

        FileInputStream fis = c.openFileInput(filename);
        Scanner sc = new Scanner(fis);
        int nprev = sc.nextInt(); // Number of previous boards to load
        sc.nextLine();
        for(int k = 0; k < nprev; k++) {
            int[] parr = new int[bsize*bsize];
            for(int i = 0; i < bsize; i++) {
                for(int j = 0; j < bsize; j++) {
                    int v = sc.nextInt();
                    parr[i*bsize+j]=v;
                }
                sc.nextLine();
            }
            prevBoards.push(parr);
        }

        sc.close();
        fis.close();
    }

bsize=8。したがって、int [64]配列を作成し、それらに数値をロードして、スタック(prevBoards)にプッシュするだけです。せいぜい64個のint[64]配列をスタックにプッシュできます。それでも、これには時間がかかりすぎると考えるのは間違っていますか?

読み込み中に、LogCatに「GC_CONCURRENTが402Kを解放し、7%が7500K / 8052Kを解放しました...」などのメッセージがスパムで送信されていることに気付きました。これは、配列が4 * 64 *64/1024=しか使用しないため意味がありません。せいぜい16KBのメモリ?

4

1 に答える 1

2

65 整数を保存し、コードを使用して onResume に再度ロードするという問題を再現しました。これらの 65 個の整数をロードするのに 3 秒かかりました!

コードが時間を失っている場所を見つけるためにプロファイリングを行ったところ、Scannerクラスが主な問題であることがわかりました。いくつかの正規表現を使用しているようで、65 回呼び出されたパターンのコンパイルでほぼすべての CPU 時間が使用されました。

スキャナー クラスの使用を避け、整数値を格納するためのより良い方法を見つける必要があります。多分http://developer.android.com/reference/java/io/ObjectOutputStream.htmlを見てください

于 2013-01-16T11:00:39.940 に答える