ORMLite的createOrUpdate似乎很慢 - 什么是正常速度?

时间:2012-08-01 14:29:02

标签: android performance ormlite

在我的应用中调用ORMLite RuntimeExceptionDao的{​​{1}}方法非常慢。

我有一个非常简单的对象(createOrUpdate(...)),有2个整数(一个是Item),一个generatedId和一个String。我用下面的代码测试(大致)更新数据库中的对象所需的时间(100次)。日志语句记录:

  

时间更新1行100次:3069

为什么在只有1行的表中更新对象需要3秒钟。这是正常的ORMLite速度吗?如果没有,可能是什么问题?

double

如果我创建100个新行,那么速度会更慢。

注意:我已使用RuntimeExceptionDao<Item, Integer> dao = DatabaseManager.getInstance().getHelper().getReadingStateDao(); Item item = new Item(); long start = System.currentTimeMillis(); for (int i = 0; i < 100; i++) { item.setViewMode(i); dao.createOrUpdate(item); } long update = System.currentTimeMillis(); Log.v(TAG, "time to update 1 row 100 times: " + (update - start)); 。它会记录ormlite_config.txt,所以这不是问题。

感谢。

1 个答案:

答案 0 :(得分:24)

不幸的是,这可能是“预期”的速度。确保使用的是ORMLite 4.39或更高版本。 createOrUpdate(...)使用更昂贵的方法预先测试数据库中现有的对象。但我怀疑这将是一个极小的速度提升。

  

如果我创建100个新行,那么速度会更慢。

默认情况下,Sqlite处于自动提交模式。要尝试的一件事是使用ORMLite createOrUpdate方法包装您的插页(或Dao.callBatchTasks(...))。

BulkInsertsTest android unit test之后,以下doInserts(...)方法会插入1000个项目。当我打电话给它时:

doInserts(dao);

我的模拟器需要7.3秒。如果我使用callBatchTasks(...)方法调用,该方法在Android Sqlite中围绕调用包装事务:

dao.callBatchTasks(new Callable<Void>() {
    public Void call() throws Exception {
        doInserts(dao);
        return null;
    }
});

需要1.6秒。使用dao.setSavePoint(...)方法可以获得相同的性能。这会启动一个事务,但不如callBachTasks(...)方法好,因为您必须确保关闭自己的事务:

DatabaseConnection conn = dao.startThreadConnection();
Savepoint savePoint = null;
try {
    savePoint = conn.setSavePoint(null);
    doInserts(dao);
} finally {
    // commit at the end
    conn.commit(savePoint);
    dao.endThreadConnection(conn);
}

这也需要约1.7秒。