Androidのメモリ効率化Tips "ArrayMap"


はじめに

Google公式のAndroid Performance Patternの内容をまとめてみました。
AndroidのPerformanceを良くするためのTipsが公開されているのですが、英語で記載されており日本語でまとめたものがないので、簡単にまとめてみました。詳細は追記していきます。

ArrayMapとは

ドキュメントによると
ArrayMapとは、Mapクラスの一つでHashMapのメモリパフォーマンスをより効率化したクラス
である。

通常のHashMapはインスタンスを生成した際に利用しないメモリまでallocate(割り当て)してしまう。androidにおいて、メモリパフォーマンス的によくない。そこでAPI Level19よりAndroid用に新しく追加されたのがArrayMap。以下のようなヒエラルキーになっている。

ArrayMapsの利用シチュエーション

item数が少ない状態で、HashMapを使いたい場合

  • mapのitem数が少ない1000以下の場合
  • mapの内部にmap(submap)を持ち、submapを頻繁にイテレートする場合

ArrayMapの仕組み

  • HashMapと大きく違う点が、要素を追加した際に順番を保持していること。任意のkeyでアクセスする際には、まず二分探索でhashのorderを特定し(下図左)その後に、Collection(keyとvalueのobjectが交互に織り合わさって構成されている(右側))に効率よくアクセスする。

メモリ効率化

  • 図のようにArrayMapはインスタンスを生成してもHashMapのように利用しないメモリを占拠しない。

ArrayMapの追加と削除

  • 上記のようにメモリの効率化が行われているが、もちろんデメリットもある。必要なメモリしか利用しないのでその分のコストはかかる。なので、前述しているが、ArrayMapは要素数が少ないときのみ利用するようにする。

  • 削除 -> 要素の削除とその配列をコピーしてメモリを必要な分のみの大きさを割り当てて再度移し替える。

  • 追加 -> 要素の追加とその配列をコピーしてメモリを必要な分のみの大きさを割り当てて再度移し替える。

orderの利用

  • ArrayMapはHashMapとは違い、要素のorderを保持しているのでHashMapのようにIteratorでのループだけでなく、indexでのloopが可能