LoginSignup
22
20

More than 5 years have passed since last update.

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

Last updated at Posted at 2015-09-20

はじめに

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

ArrayMapとは

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

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

Kobito.if8zv3.png

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

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

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

Kobito.D6LlvN.png

ArrayMapの仕組み

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

Kobito.Dd1nql.png

メモリ効率化

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

Kobito.mQ5B43.png

ArrayMapの追加と削除

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

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

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

Kobito.pkfzwS.pngKobito.Y31v9X.png

orderの利用

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

Kobito.Hsp1Rs.png

22
20
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
22
20