Realm事务与SQLite

时间:2016-04-06 16:02:21

标签: android sqlite transactions benchmarking realm

我试图将Realm与SQLite的性能进行比较以获得玩具示例。这是我的测试类:

public class Folder extends RealmObject {
    @PrimaryKey
    @Index
    private int id;
    private String name;
    private int numMessages;
    private int numRead;

    ...

}

我编写了等效的Realm和SQLite DAO。在两种情况下,所有写入都在事务内部进行。除了PK之外,SQLite中没有索引。

我运行了一个小的非正式基准测试(N = 10000),输入数据完全相同,每个持久性机制的顺序相同。我发现了:

  1. 批量写入的顺序大致相同,有时在Realm中快2倍,但有时会慢一点。
  2. 逐个删除和更新(按id)在Realm中慢6倍。需要大约7分钟来逐个更新10k元素的数组,而SQLite需要1分钟。
  3. 通过id查询在Realm中快6倍,但按名称排序时速度要慢1.6倍。
  4. 我并不是真正关心#1,因为这不是一个合适的基准,而且从一次迭代到下一次迭代的时间变化很大。

    但是#2真的让我感到惊讶,因为时间在迭代中实际上是一致的。每个单独的更新或删除都是在事务中完成的(我通常会在真实事务中批量处理)。这是我编写实例的方式:

    realm.executeTransaction(new Realm.Transaction() {
    
        @Override
        public void execute(Realm realm) {
            realm.copyToRealmOrUpdate(<some folder>);
        }
    });
    

    这就是我通过id删除的方式:

    realm.executeTransaction(new Realm.Transaction() {
    
        @Override
        public void execute(Realm realm) {
            realm.where(Folder.class).equalTo("id", <some id>).findAll().clear();
        }
    });
    

    可能导致经济放缓的原因是什么?是交易机构还是交易开销?

    关于#3我也对排序结果时性能略差的问题感到困惑。 这是我通过id获取的方式:

    Folder result = realm.where(Folder.class).equalTo("id", <some id>).findFirst();
    

    这就是我获取所有排序的方式:

    RealmResults<Folder> results = realm.where(Folder.class).findAllSorted("name");
    

    排序是否昂贵?

    UPDATE:

    这是在使用id(显示包含时间)逐个更新元素时​​从tracedump中获取的前10个表

        Method                                  Incl Cpu Time%
        ======================================================
        Real.copyToRealmOrUpdate                92.1%
        Realm.copyOrUpdate                      88.7%
        DefaultRealmModuleMediator.copyOrUpdate 85.3%
        FolderRealmProxy.copyOrUpdate           83.5%
        FolderRealmProxy.copyOrUpdate           80.1%
        Realm.createObject                      48.1%
        Table.addEmptyRowWithPrimaryKey         31.4%
        UncheckedRow.setLong                    17.6%
        Table.getUncheckedRow                   17.1%
        UncheckedRow.getByRowIndex              16.4%   
    

0 个答案:

没有答案