「Intのみが必要な場合は列挙型を回避する」セクションが公式開発者向けドキュメントから削除されました。(古いセクションの内容については、Androidがenumを使用しない理由を参照してください)
どうして?ヒントを廃止したAndroid VMの変更はありましたか?
「Intのみが必要な場合は列挙型を回避する」セクションが公式開発者向けドキュメントから削除されました。(古いセクションの内容については、Androidがenumを使用しない理由を参照してください)
どうして?ヒントを廃止したAndroid VMの変更はありましたか?
回答:
そのドキュメントの元のバージョンは偏見の集まりでした。実際のベンチマークでバックアップされたファクトのみを含むように書き直され、VMが更新されると更新されます。http://code.google.com/p/dalvik/で、さまざまなベンチマークに加えて、コアライブラリの最適化に使用するいくつかのベンチマークを見つけることができます。
推測:
したがって、GUIアプリの比較的平凡な要件の場合、列挙型の開発時の利点は、追加のランタイムコストをはるかに上回ります。
Elliott Hughesは、彼のブログでドキュメントの書き換えに関する詳細を公開しています。http://elliotth.blogspot.com/2010/09/java-benchmarks.html
投稿の後半では、パフォーマンスドキュメントに関するすべての申し立てがベンチマークでバックアップされていることを説明しています。以前のバージョンのドキュメントには、「列挙型は高すぎるため、列挙型を避けてください」などの未検証の主張が含まれていたようです。
Elliot Huguesの2011年の回答によると、列挙型を回避する最初の理由は、「処理パフォーマンス」の場合のように、パフォーマンス上の理由によるとのことです。この理由は事実に裏付けられていないため、公式ドキュメントから削除されました。
enumは整数を使用するよりも多くのデータをメモリに追加するため、後で追加されました。
IntDef
アノテーションを導入しました。これにより、Android Studioのエラーと警告でint定数を安全に使用できます。blog.shamanland.com/2016/02/int-string-enum.html
TLDR: Dalvikはメモリ割り当てに問題がありEnum
、よりも多くのメモリを使用していますint
。Android Lollipopは、Dalvikを、同じ制限の影響を受けないARTに置き換えました。したがって、この推奨事項はもはや関係ありません。
長い答え:
うわー!8年後、5つの回答と多くのコメントの後、本当の理由はまだ対処されていません。
Androidのロリポップ以前の時代には、DalvikがVMのプロセスとして使用されていました。その間、アプリケーションで使用できるメモリは少量だったため、Dalvikには多くのメモリ制約がありました。メモリ割り当てのために、Dalvikはヒープをウォークしてスペースを見つける必要がありました。ヒープも時間とともに断片化します。Dalvikはデフラグできなかったため、時間の経過とともに割り当てられ、最終的にスペースが不足しました。
Intのみが必要な列挙型を回避する
ためのDalvikの日から来てEnum
より多く大きいint
とメモリの割り当ては非常に高価でした。
今日、早送りして、DalvikはARTに置き換えられました。ARTはKitKatでリリースされ、Lollipop以降のデフォルトです。
ARTは、メモリを最適化するためではなく、パフォーマンスを最適化するためにゼロから作成されました。また、割り当てとコレクション用に最適化されています。その理由は、大きなオブジェクト用にメモリが確保されているためです。すべてを同じヒープに配置し、すべての小さなオブジェクトの中で大きなオブジェクト用のスペースを見つける必要がある代わりに、ARTはすべての大きなオブジェクトとビットマップを別のヒープに配置します。そして、小さなオブジェクトは別のヒープに入ります。また、最適化することもできます。
ARTの後、Enum
Android を使用するかどうかは問題ではありません。そのため、現在、推奨はありません。
これはGoogleのChet Haaseによるものです。私は彼のGoogle I / Oの話を見つけてビデオ全体を見ることをお勧めします。Androidに関する多くの有用な情報と洞察が含まれています。
それはまだメモリパフォーマンスに悪いです。
https://developer.android.com/training/articles/memory.html#Overhead
編集:削除されました。enumを使用しても安全です。