Android甚の9぀のORMのベンチマヌク

むンタヌネットには、Android向けの特定のORMに関する断片的な情報がたくさんありたす。 これたでのずころ、私は䞻芁なORMの定性的な比范に出くわしおいたせん。 既存の蚘事は、いずれかのシステムのPRを叩き、テストを誀っお蚭定したり、意図的に誀った蚭定を䜿甚したり、テストに匷力な敵を含めないこずにより、競合他瀟を䞍利にしたす。



このテストは、むしろ私自身の興味のために実斜されたした。 なぜなら 倚くのORMがあり、それらはすべお異なっおいたす。既存のシステムに぀いお客芳的な芋方をしたいず思いたす。



基本はAndroidDatabaseLibraryComparisonリポゞトリです。 オリゞナル蚘事はこちらです。 ご芧のずおり、著者は最初にGreenDaoをレビュヌに含めないようにしたした。䜕床か尋ねられたずき、圌はたったく間違った蚭定でそれをオンにしたした。



それずは別に、ほずんどのORMはただ本栌的ではなく、アノテヌションや個別のサブク゚リを䜿甚せずにネストされたコレクションを持぀オブゞェクトの曞き蟌みず読み取りをサポヌトするラむブラリはほずんどありたせん。



テスト方法



2぀のモデルがテストされたした。 シンプル、いわゆる ポゞョ 



シンプル
public class SimpleAddressItem{ String name; String address; String city; String state; long phone; }
      
      







単玔型、線圢構造。 このオブゞェクトは10,000コピヌで䜜成され、コピヌはコレクションに配眮され、コレクションはORMを䜿甚しおデヌタベヌスに保存されたした。 それは6回繰り返されたした。



読み取り段階では、コレクションが読み取られ、読み取りフィヌルドが調敎されお、最初にデヌタの曞き蟌みず読み取りが制埡され、2番目にトリッキヌな遅延読み取りが回避されたした。 読み取りごずに、アプリケヌションはタスクマネヌゞャヌによっお閉じられ、再び起動されたした。 実際、Realm、DBFlow、GreenDaoなどの䞀郚のORMには独自のキャッシュがありたす。 たた、蚘録盎埌、たたは連続しお2回カりントするず、キャッシュで読み取りがほが瞬時に発生し、党䜓の結果がゆがめられたす。 はい、これは利点ず芋なすこずができ、ORMを遞択するずきに考慮する必芁がありたす。



掗緎されたモデル。 ネストされたリストを持぀オブゞェクト



難しい
 public class AddressBook{ Long id; String name; String author; Collection<AddressItem> addresses; Collection<Contact> contacts; } public class AddressItem extends SimpleAddressItem { AddressBook addressBook; } public class Contact{ String name; String email; AddressBook addressBook; }
      
      







オブゞェクトは50コピヌで䜜成されたした。 ネストされた各コレクションも50コピヌで埋められたした。 蚘録枈み。 読み取り時に、デヌタの正確性がチェックされたした。



たた、各テストは6回実行されたした。 結果のグラフでは、列の数はランタむムの平均倀です。



結果



たくさんの写真があるので、ネタバレの䞋で



結果
シンプルなモデル。 蚘録







シンプルなモデル。 読曞







シンプルなモデル。 Sugar ORMを䜿甚しない読曞







掗緎されたモデル。 蚘録







掗緎されたモデル。 読曞







掗緎されたモデル。 Sugar ORMを䜿甚しない読曞







テスト参加者



1. レルム



本圓に速い。 確かに、堎合によっおは玔粋なSQLiteよりも高速ですSQLは単玔なフラットアルゎリズムを䜿甚しおいるこずに泚意する必芁がありたす。考えおみるず、LEFT JOINを䜿甚しおデヌタベヌスぞの呌び出し回数を枛らすこずができたすが、それに぀いお考える必芁がありたす。ご垌望の堎合-ようこそ。 匷調すべきこずは実装が非垞に簡単です。 盎感的。 倧きな利点は、レルムが本栌的なORMであるこずです。 ぀たり オブゞェクトを保存する/オブゞェクトを読む内郚コレクション、それらの関係に぀いお考える必芁はありたせん。クレむゞヌな「Foreign ...」、「One-to-many ...」キヌなどのツむストを泚釈する必芁はありたせん。 すべおがボックスで機胜したす。



しかし、欠点もありたす。 それでも、コン゜ヌルにアセンブラヌスタックがあるず奇劙なクラッシュが発生したす。 はい、それらは非垞にたれですが、ありたす。 すべおのフィヌルドはプラむベヌトでなければならず、各フィヌルドには空のコンストラクタヌずゲッタヌ+セッタヌが必芁です。 もちろん、Lombokのサポヌトは最新バヌゞョンに登堎したしたが、これはただ+1ラむブラリであり、プロゞェクトぞの+1プラグむンです。 もちろん、Lombokを䜿甚しない堎合、これはAndroid Studioの3぀のショヌトカットで行われたすが、これはプロゞェクトのボむラヌプレヌトコヌドの束です。 サむズずいえば、Realmを接続するためだけにAPKに+5メガバむト。



プロゞェクトを初めおアセンブルする前に、存圚しないコンパむル時のクラスも考慮する必芁がありたす。 Parcelerの難しさ、RealmResultずRealmObjectの違い、realm.closeの埌にオブゞェクトを読み取るこずができない。 RealmList / RealmResultコレクションは、Listから継承されたすが、addAll、indexOf、toArrayなどの倚くの基本的なメ゜ッドをサポヌトしたせん。 これはすべお远加の問題を远加したす。 もちろん解決できたすが、プロゞェクトの耇雑さが増しおいるため、これも考慮に入れる必芁がありたす。



䞀般に、Realmでの䜜業は玠晎らしいこずです。 さらに、優れたドキュメント、ほがすべおの問題は公匏Webサむトを読むこずで解決できたす。



2. OrmLite



非垞に叀く確立されたORM。 1぀の問題最埌のリリヌスは3幎前でした。 時代遅れの倚く。 アプロヌチ自䜓は叀くなっおいたす。 2016幎にコンパむル時の泚釈を䜿甚したコヌド生成 これに真剣に参加したいですか 䞀般的に、それは通垞の平均ずしお衚瀺されたす。 どこか5-6mの堎所ではありたせん。 唯䞀の䟿利な機胜芪を読み取るずきに、ネストされたコレクションを自動的に読み取る。 レルムのように。 遅いだけです。 しかし、他のORMはそうではありたせん。



3. GreenDao



SQLite甚の超高速Android ORM。 これは公匏りェブサむトに蚘茉されおいたす。 そしお圌は本圓に超高速です。 時にはレルムよりも高速です。 しかし、再び、コヌド生成。 远加のコマンドを䜿甚しお、別のプロゞェクトでデヌタベヌスを䜜成し、それをコンパむルする必芁がありたす。そうしお初めお、䜜業できるクラスができたす。 生成されたクラスは倉曎できたすが、特別なコメントを含めない堎合、再生成䞭に新しい方法ですべお䜜成されるこずに泚意しおください。 ラむブラリ自䜓は高速で小さいです。 そのため、プラスずマむナスがありたす。 䜿甚するかどうか-あなたが決める。



4. DBFlow



もう1぀のお気に入りは速床ですただし、䟿宜䞊ではありたせん。 著者が䞻匵するように、非垞に高速-最速のAndroid ORMデヌタベヌスラむブラリヌですが、そうではありたせん。 泚釈凊理、぀たり コンパむル䞭のコヌド生成。 その結果、たずえば、saveは最高のパフォヌマンスを提䟛するsql compileStatementコマンドに倉わりたす。 もちろん、工堎や反射で速床が䜎䞋したす。速床がなければ速床は䜎䞋したす。 結果のキャッシュをサポヌトしおいるため、キャッシュからデヌタをほが瞬時に取埗できたす。



しかし、欠点もありたす。ラむブラリが開発䞭であり、珟圚のリリヌスでは、3番目のベヌタバヌゞョンは2番目ず互換性がありたせん。 2番目のいく぀かの䟋の公匏文曞の半分は、公匏文曞が䞍完党であり、堎合によっおぱラヌもありたす。 グリッチは、最も予期しない堎所で発生したす。 たずえば、クラスが倧文字で配眮されおいるpakageずいう名前を付けた堎合、プロゞェクトはコンパむルされたせん。 そしお、あなたはその理由すら知らないでしょう。 通垞のテキスト゚ラヌはありたせん。 移行の問題。 たぶん、あなたがもっず長く座っおいれば、䜕かがうたくいくかもしれたせんが、䟋によっおすべおをしたしたが、私の移行はうたくいきたせんでした。 通垞、このラむブラリを通垞どおり䜿甚するには、倚くの工数を費やす必芁がありたす。 しかし、どこたで行くかずいう䟋はありたすが、著者自身はこのテストに䟋を持っおいたせんでした。



5. 食噚棚



シンプルで、それほど遅くはなく、時には高速です。 泚釈がなくおも機胜したす しかし、圓然のこずながら、あらゆる皮類の@IgnoreやIndexさえありたす 。 唯䞀の問題は、オブゞェクトからではなく、デヌタベヌスから機胜するこずです。 ぀たり オブゞェクトを蚘録するには、次の操䜜を行う必芁がありたす。



 CupboardDatabase database = new CupboardDatabase(context); SQLiteDatabase db = database.getWritableDatabase(); DatabaseCompartment dbc = cupboard().withDatabase(db); dbc.put(addresses);
      
      





これは必ずしも䟿利ではありたせん。 さらに、オブゞェクトごずにLong _idフィヌルドが必芁です。



6. 振りかける



ラむブラリは私によっおレビュヌに远加されたせんでしたが、欠萜しおいるテストを完了したした。 ラむブラリはひどいです。 ひどい。 グラフを芋おください。 理由を知っおいたすか 著者はデヌタベヌスのすべおのレコヌドに察しお「SELECT * FROMs WHEREs LIMIT 1」を実行するためです はい、はい。 これらの䜜成者は、「INSERT OR REPLACE」を゚ミュレヌトしたす。 そしお、あなたには遞択肢がありたせん。 Saveのみがあり、それで終わりです。 読み取りは、sqlに察する単玔なラッパヌですQuery.manyAddressItem.class、 "select * from AddressItem where addressBook ="、String.valueOfid。Get。AsList。 ORMですか そう ベヌスを䜜成するメカニズムはたったくありたせん。 「CREATE TABLE」を手動で䜜成したす。



7. ActiveAndroid



たあ、私は䜕を蚀うこずができたす。 メリットのない単なるORM。 速床も同じです。



8. Ollie



別のコンパむル時ORM。 党䜓的にかなり機敏です。 利点/欠点に぀いおは䜕も蚀えたせん うたくいきたせんでした。



9. シュガヌORM



シンプルで手頃な䟡栌ですが、非垞に遅いです。 泚釈の実行時の読み取りによる反射の反映により、䜜業が非垞に遅くなりたす。 最近たで、圌はデヌタベヌスの各゚ントリに「Log.iSUGAR、object.getClass。GetSimpleName+」saved "+ id;"ず曞いおいたした。 この行を削陀するず、曞き蟌み速床が2倍になるこずがありたす 著者は、単玔化のためにパフォヌマンスを心配しおいないようです。 しかし、単玔さで、すべおが敎然ずしおいたす最小限の泚釈、単玔な保存、怜玢、しかし誰があなたを驚かせたすか



10. SQLlite。



ここでは、最高速床を目指した玔粋なSQLに぀いお説明しおいたす。 これらは、「compileStatement」ずbindStringi、value、はい、はい、名前ではなくむンデックスです。 ContentValuesもありたせん。 私のシフトではありたせん



SQLlistは確かに、ほずんど垞にリヌダヌである最も玔粋な圢匏です。 唯䞀の䟋倖は耇雑な読み取り操䜜の領域であり、おそらくnosqlデヌタベヌス構造に通知したす。 しかし、前述したように、これは最適化できるず確信しおいたす。



誰かが最初のグラフの「SQLite 50x」列の意味を尋ねたすか デヌタベヌスぞの各挿入が50個のオブゞェクトによっお行われる堎合、これは耇数行のレコヌドです。



INSERT INTO table VALUES1 ,? 2 ,? 3、VALUES4 ,? 5 ,? 6、VALUES7 ,? 8 ,? 9...



これはコヌドを非垞に耇雑にするため、単玔なテストのために䜜成したした。 githubプロゞェクトでは、このコヌドはコメント化されおいたす。

玔粋なSQLでは、むンデックスの効果も特に顕著であり、むンデックス付きテヌブルぞの曞き蟌みがどのように遅くなり、読み取りがどのように加速されるかがわかりたす。 たあ、これらは䞀般的な真実であり、誰もがタスクのむンデックスの䜿甚を遞択する必芁がありたす。



おわりに



もちろん、テストは完党ではありたせん。 確かに、ランダム読み取りの速床は考慮されたせん。 ORMの初期化速床のテストもありたせん。 ORMラッパヌ自䜓を䜜成しおから、デヌタベヌスを䜿甚する準備が敎うたでの時間。 Snappy-DBのようなNoSQLがあり、実際の動䜜を芋るず興味深いでしょう。 requeryのような新しいORMがありたすが、これらに぀いおはほずんど知られおいたせんが、それらのステヌトメントは盞倉わらず倧音量ですRxJavaサポヌト、無反射など。



これには時間がかかりたす。必芁に応じお、プロゞェクトコヌドを開いおください github.com/Rexee/AndroidDatabaseLibraryComparison



All Articles