13

Simple XML ライブラリを使用して、Android アプリケーションで XML ファイルを処理しています。これらのファイルは非常に大きくなる可能性があり (約 1Mb)、かなり深く入れ子になる可能性があるため、かなり複雑です。

アプリが Simple API を介してこれらのファイルの 1 つを読み込むと、完了するまでに最大 30 秒かかる場合があります。現在、Simple の Persister クラスの [read(Class, InputStream)][2] メソッドに FileInputStream を渡しています。事実上、XML ノードを読み取り、データをモデル オブジェクトのインスタンスにマップして、メモリ内の XML ツリー構造を複製するだけです。

私の質問は、Android でパフォーマンスを向上させるにはどうすればよいですか? 私の現在の考えは、ファイルの内容をバイト配列に読み込み、代わりに ByteArrayInputStream を Persister の read メソッドに渡すことです。ファイルを処理する時間はもっと速くなると思いますが、ファイル全体を最初に読み取るのにかかる時間によって、節約された時間が打ち消されるかどうかはわかりません。また、メモリの制約も問題になる可能性があります。

これは愚かな用事ですか?この状況でパフォーマンスを向上させるために他にできることはありますか? そうでない場合は、ファイルの読み込みの進行状況に関するユーザーへのフィードバックを改善する必要があります。

いくつかの注意事項:

1) 使用している XML ライブラリを変更できません。問題のコードは、デスクトップ、モバイル、および Web アプリケーションで使用される「エンジン」の一部です。それを変更するためのオーバーヘッドは当分の間多すぎるでしょう。

2)データファイルはユーザーによって作成されるため、ネストのサイズ/深さを制御できません。

4

1 に答える 1

17

さて、これを改善するためにできることはたくさんあります。どうぞ。

1) Android では、少なくともバージョン 2.5.2 を使用する必要がありますが、Android ではるかに高速でメモリ効率の高い KXML を使用するため、理想的には 2.5.3 を使用する必要があります。

2) Simple はオブジェクト グラフを動的に構築します。これは、まだロードされていないクラスをロードし、リフレクションを使用して注釈に基づいて各クラスのスキーマを構築する必要があることを意味します。したがって、最初の使用は常に最も高価になります。同じ永続化インスタンスを繰り返し使用すると、何倍も高速になります。したがって、複数の永続化インスタンスを避けるようにしてください。可能であれば 1 つだけを使用してください。

3) Simple XML ライブラリを使用せずに、ファイルを直接読み取るのにかかる時間を測定してみてください。それはどのくらいかかりますか?永遠にかかる場合は、ここでのパフォーマンス ヒットがファイル システムによるものであることがわかります。BufferedInputStream を使用してパフォーマンスを向上させてみてください。

4) 問題が解決しない場合は、メーリング リストで報告してください。

編集: Android には、注釈処理に関するいくつかの問題があります https://code.google.com/p/android/issues/detail?id=7811、単純な 2.6.6 修正により、これらの問題の回避策が実装されました。10 倍のパフォーマンスの向上が見られます。

于 2011-06-01T23:44:20.480 に答える