9

アプリでORMLiteRuntimeExceptionDaocreateOrUpdate(...)メソッドを呼び出すのが非常に遅いです。

Item2 つの ints (1 つはgeneratedId)、 a 、Stringおよび aを持つ非常に単純なオブジェクト ( ) がありdoubleます。以下のコードを使用して、データベース内のオブジェクトを更新するのにかかる時間 (およそ 100 回) をテストします。ログ ステートメントは次のように記録します。

1 行を 100 回更新する時間: 3069

1 行しかないテーブルで、オブジェクトを 100 回更新するのに 3 秒かかるのはなぜですか。これは通常の ORMLite の速度ですか? そうでない場合、何が問題なのですか?

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));

100 の新しい行を作成すると、速度はさらに遅くなります。

注:私はすでに使用していormlite_config.txtます。ログに記録"Loaded configuration for class ...Item"されるため、これは問題ではありません。

ありがとう。

4

1 に答える 1

24

残念ながら、これは「予想される」速度である可能性があります。ORMLiteバージョン4.39以降を使用していることを確認してください。 createOrUpdate(...)より高価な方法を使用して、データベース内のオブジェクトの存在を事前にテストしていました。しかし、これは最小限の速度向上になると思います。

100個の新しい行を作成すると、速度はさらに遅くなります。

デフォルトでは、Sqliteは自動コミットモードです。試してみる1つのことは、 ORMLiteメソッドを使用してインサート(またはcreateOrUpdates)をラップすることです。 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秒かかります。

于 2012-08-01T15:05:09.107 に答える