12

簡単に言うと、android.os.Bundleクラスのクローン実装をそのクラスに対してテストして、どちらが優れているかを確認したいと思います。自分のバージョンがもっと悪くなる可能性があることはすでに知っていますが、どれだけ悪くなるか知りたいです。どのオブジェクトがメモリ内で大きいか、および/または値の保存/取得に時間がかかるかを確認するために使用できるAndroid用のベンチマークツールはありますか?

TL; DR:

android.os.Bundleクラスのソースコードを調べましたが、オブジェクトを保存して返す方法が好きではありません。それらをに格納し、ClassLoaderを使用しHashMap<String, Object>て要求されたオブジェクトのクラス(getString()またはなど)にキャストするだけです。getInt()これ、またはそのことに関するクラスのキャストは、型の安全性に違反し、静的型付けが防止しようとしているプログラミングレベルでのあいまいさをもたらすと思いますが、そうではありませんか?

型安全性に違反せず、あいまいさを導入しない、同様のデータコンテナクラスを作成したいと思います。論理的に単純ですが明らかに非効率的な方法は、保存したいクラスごとにマップを作成することです。

私が決めたのは、HashMap<String, Integer>保存したい各クラスのリストの品揃えのキーインデックスマッピングを含むシングルでした。たとえば、を呼び出すとgetString(String key)、そのキーに関連付けられている整数インデックスが存在する場合はマップから取得し、関連付けられているのそのインデックスにあるオブジェクトを取得しようとしますArrayList<String>

ここでの唯一のあいまいさは、null(そのクラスのリストにインデックスが存在しない場合)または正しいクラスの間違ったオブジェクト(マップされたインデックスは存在するが、そのキーで保存された元のオブジェクトが別のリストにある場合)を返すことです。 、これは実際にチェックするプログラマーの責任です。

このクラスのオブジェクトは一時的なコンテナであり、標準化された方法である場所から別の場所にデータを送信するために使用されます。彼らは固執することを意図していません。また、バンドルと同じように使用されるわけではありませんが、このような統合データコンテナーが必要な理由の一部は、、、、またはその逆に簡単に変換できるようにするためBundleです。JSONObjectContentValuesCursor

あるいは、本当の問題は、キャストが本当にひどいのか、それともそれを回避するために極端な努力をするだけなのかということです。どちらの場合も、あいまいさを回避する唯一の方法は、優れたプログラミングだと思います。

アップデート:

Bundleは、Parcelから自身を解凍するときにのみクラスローダーを使用するように見えますが、put()を呼び出すたびにunparcel()を呼び出します。取得するときは、メソッドが返す型にキャストするだけで、のtry-catchブロック内にありClassCastExceptionます。それはおそらくそれを行うための最も簡単な方法です。

4

4 に答える 4

4

どのオブジェクトがメモリ内で大きいか、および/または値の保存/取得に時間がかかるかを確認するために使用できるAndroid用のベンチマークツールはありますか?

はい、Androidには開発者向けの優れたツールがたくさん付属しています。それらを理解することをお勧めします。ここに、良いスタートを切るための公式ドキュメントリンクがあります。

Eclipseを使用していると仮定して、DDMSパースペクティブに切り替えます。

さて、これらのビューは、メモリの測定に役立つはずです。

  • 割り当てトラッカー。どのオブジェクトがどのくらいのメモリを使用しているかを確認できます。実行中は、「追跡の開始」ボタンと後で「割り当ての取得」ボタンを押す必要があります。
  • ヒープ。ヒープから取得されたメモリの量を確認できます。

アプリケーションのプロファイルを作成するには、ボトルネックなどを参照してください。Traceviewを使用してください。Eclipseから便利に呼び出すには、スレッドビューを開き、プログラムの実行中に「録音ボタン」のような赤い丸の付いたボタンをクリックします。

于 2013-01-16T19:53:05.753 に答える
3

オブジェクトをSerializableにすることが可能な場合(Serializableインターフェースを実装することにより)。次に、次のコードを実行します。オブジェクトに必要なバイト数をチェックします。

private byte[] getBytes(Object o) {
    ByteArrayOutputStream bos = new ByteArrayOutputStream();
    ObjectOutput out = null;
    try {
        out = new ObjectOutputStream(bos);
        out.writeObject(o);
        return bos.toByteArray();
    } catch (IOException e) {
        e.printStackTrace();
    } finally {
        try {
            if (out != null) {
                out.close();
            }
        } catch (IOException ex) {
            // ignore close exception
        }
        try {
            bos.close();
        } catch (IOException ex) {
            // ignore close exception
        }
    }
    return null;
}
于 2016-07-04T15:42:10.987 に答える
2

どのオブジェクトがメモリ内で大きいかを確認するために使用できるAndroid用のベンチマークツールはありますか?

マット。

および/または値の保存/取得に時間がかかりますか?

Traceview。

これ、またはそのことに関するクラスのキャストは、型の安全性に違反し、静的型付けが防止しようとしているプログラミングレベルでのあいまいさをもたらすと思いますが、そうではありませんか?

静的型付けは調味料のようなものです。適切な量​​はテイスターによって異なります。

于 2013-01-16T19:48:21.070 に答える
1

MAT(メモリアナライザツール)もお勧めしますが、注意点があります。特定のバージョンでは、画像などがヒープメモリに保存されないことを知っておいてください。たとえば、ハニカムの前は、画像はネイティブメモリに保存されます。したがって、メモリのチェックは常に正確であるとは限りませんが、あなたの場合はそれをお勧めします。

于 2013-01-16T19:52:58.140 に答える