2

私は、高度に最適化する必要がある Android プロジェクトに取り組んでいます (これは他のアプリに組み込まれている SDK であるため、可能な限り効率的かつ小さくする必要があることは明らかです)。これまでは主に Web/サーバー開発を行ってきたので、これは私にとって比較的新しいことです。

ここで質問があります: 計算/フェッチをやり直すのではなく、値をキャッシュするのはいつ意味があるのでしょうか。明らかに、計算/フェッチに時間がかかり、使用頻度が高いほど、キャッシュの候補として適しています。しかし、キャッシュのダイナミクス/コスト/報酬は、サーバー アプリとモバイル アプリではまったく異なります。

多くの同時要求を処理する大量のメモリを備えたサーバーでは、繰り返し使用される値をキャッシュすることは理にかなっています。モバイル デバイスでは、メモリに制約があります。値が繰り返し使用される場合でも、それをキャッシュするか、再計算/再読み取りする方が効率的ですか? (ネットワーク データについて話しているのではありません。明らかにローカルにキャッシュすることでメリットが得られます。ローカル ファイルから計算または解析された値について話しているのです)

これが私が疑問に思っている例です:

if (s_pattern == null) {
    s_pattern = Pattern.compile(REGEX);
}

一方で、RegEx を 1 回だけコンパイルしてキャッシュすることは理にかなっていますが、他方では、追加のメモリを使用することを正当化するために多くのメリットがあるかどうかはわかりません。

誰かが経験や洞察を持っていますか? それとも経験的なデータがありますか?

4

1 に答える 1

1

if (s_pattern == null) { s_pattern = Pattern.compile(REGEX); }

[private|public|] static final PATTERNこれは、変更されず、定義クラスが使用されるときに常に使用される場合、定数 ( ) として保持するのに適した候補です。

これらのオブジェクトやその他の「小さな」オブジェクトをいくつか保持しても、問題は発生しません。毎回それらを再作成すると、メモリ内にそのオブジェクトの複数のインスタンスを持つことができるため、より多くのメモリを使用することさえできます.ガベージコレクションはすぐには削除されません. また、一定のオブジェクトの再作成は CPU 時間を消費しますが、これもモバイル デバイスでは制限されます。

可能な限り、レクリエーションよりもキャッシュを好みます。例外は、数百キロバイトを使用するビットマップのような大きなオブジェクトです。

Android で発生するほとんどすべてのメモリの問題は、意図的なキャッシュに関連するものではなく、意図しないリークや大きな画像の誤用に関連しています。

ところで:これは経験的なデータに基づいていませんが、それらの原因を確認すると、いくつかを得ることができます:[android]+OutOfMemoryException

于 2012-04-19T16:20:30.323 に答える