我试图将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,因为这不是一个合适的基准,而且从一次迭代到下一次迭代的时间变化很大。
但是#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%