【Android】ORM效能分析(序)

§・前言

簡單來說,就是因為一次 Android Developer讀書會的活動是介紹三種 ORM(Object Relational Model),分別是 ormlite、greenDAO、Realm,然後起因是因為 Realm 的官網說明他們的效能遠超過 ormlite 與 greenDAO,所以我就燃起了挑釁的戰鬥心理測試的鬥志,開始撰寫一個專門測試這三種 ORM 的 app

我應該會找個時間丟上架~那目前有上傳至 Github ,歡迎取用查閱

ORM效能分析測試app傳送門
補充:目前只有 insert 的功能,這幾天會再繼續補上其他測試,下一個是 Query,至於環境嘛......先放一邊ヽ( ̄д ̄;)ノ=3=3=3

其實因為是昨天一直在設定上出包結果老是 run 不過,最後拖到半夜才完成
但半夜完成有半夜完成的錯誤地方:條件設定錯誤

總之會發現這個錯誤要感謝 Cateyes Lin
然後接著我就在昨天的讀書會活動上被砲了(誤)~~
詳細可見Live house直播之紀錄

不過首先還是先來看一下錯誤條件導致的錯誤數據吧

數據如下

  • ormlite:
    • 45.9sec per 100k
  • greeDAO:
    • 7.3sec per 100k
  • realm:
    • 18.5sec per 100k

結果 ormlite 耗時太久被 Cateyes Lin 抓包,直接去看了我的 code,然後就發現裡面在 insert 的時候多做了 「IfNotExist」 的確認動作,所以等於是每次 insert 都額外做了一次搜尋,也難怪時間花超久

而至於 realm 的部分則是設了一個 primary key,這是造成 realm 速度降低的主因

然後以下是修改後的 code

Ormlite
            Dao<Character, Integer> dao = null;
            long ormliteTime = System.currentTimeMillis();
            try {
                dao = DAOFactory.getInstance().getDbHelper().getDao(Character.class);
                int ormCount = Integer.parseInt(editTextOrmlite.getText().toString());
                DAOFactory.getInstance().beginTransaction();
                for (int i = 0; i < ormCount; i++) {
                    Character characterOrmlite = new Character();
                    dao.create(characterOrmlite);
                }
            } catch (SQLException e) {
                e.printStackTrace();
            }
            DAOFactory.getInstance().commitTransaction();
            long ormliteElapsedTime = System.currentTimeMillis() - ormliteTime;
            textViewOrmlite.setText(String.valueOf(ormliteElapsedTime) + "ms");
GreenDao
            int greenCount = Integer.parseInt(editTextOrmlite.getText().toString());
            long greenTime = System.currentTimeMillis();
            CharacterDao characterDao = DBHelper.getInstance(getActivity()).getCharacterDao();
            SQLiteDatabase db = characterDao.getDatabase();
            db.beginTransaction();
            for (int i = 0; i < greenCount; i++) {
                com.takumalee.ormcomparison.database.greendao.dao.Character greenCharacter = new com.takumalee.ormcomparison.database.greendao.dao.Character(null, "C", "S");
                characterDao.insert(greenCharacter);
            }
            db.setTransactionSuccessful();
            db.endTransaction();
            long greenElapsedTime = System.currentTimeMillis() - greenTime;
            textViewGreenDao.setText(String.valueOf(greenElapsedTime) + "ms");
Realm
            int realmCount = Integer.parseInt(editTextOrmlite.getText().toString());
            long realmTime = System.currentTimeMillis();

            Realm realm = Realm.getDefaultInstance();
            realm.beginTransaction();
            for (int i = 0; i < realmCount; i++) {
                RealmCharacter realmCharacter = realm.createObject(RealmCharacter.class);
//                    realmCharacter.setId(i);

                realmCharacter.setAttributes(String.valueOf(i));
                realmCharacter.setCareers(String.valueOf(i));
            }
            realm.commitTransaction();
            long realmElapsedTime = System.currentTimeMillis() - realmTime;
            textViewRealm.setText(String.valueOf(realmElapsedTime) + "ms");

然後經過以上的修正之後,
新的數據如下:

  • ormlite:
    • 14.1sec per 100k
  • greeDAO:
    • 7.1sec per 100k
  • realm:
    • 8.6sec per 100k

不過realm看起來還是沒有官方說的那麼好的樣子
看來得去寄個信問他們測試的方法了XD

PS: Cateyes Lin 表示他會先去戳他們~~・゜゚・:.。..。.:・'(゚▽゚)'・:.。. .。.:・゜゚・

Comments

comments powered by Disqus