我正在使用外部存储将事件存储在数据库中,同时等待将它们发送到服务器。
插入记录时,我看到性能非常差。我知道外部存储器可能很慢,但我想看到一些数字,所以我写了一个小应用程序来测试它。
这是代码:
public static final int INSERTS = 100;
File dbFile = new File(Environment.getExternalStorageDirectory(), "test.sqlite3");
// File dbFile = new File(getFilesDir(), "test.sqlite3");
dbFile.delete();
SQLiteDatabase db = SQLiteDatabase.openOrCreateDatabase(dbFile, null);
db.execSQL("CREATE TABLE events (_id integer primary key autoincrement, event_type TEXT NOT NULL, timestamp BIGINT, data TEXT);");
db.execSQL("CREATE INDEX mainIndex ON events (event_type, timestamp ASC);");
InsertHelper helper = new InsertHelper(db, "events");
final int eventTypeCol = helper.getColumnIndex("event_type");
final int timestampCol = helper.getColumnIndex("timestamp");
final int dataCol = helper.getColumnIndex("data");
long start = System.currentTimeMillis();
String eventType = "foo", data = "bar";
long timestamp = 4711;
for(int i = 0; i < INSERTS; ++i) {
helper.prepareForInsert();
helper.bind(eventTypeCol, eventType);
helper.bind(timestampCol, timestamp);
helper.bind(dataCol, data);
helper.execute();
}
long end = System.currentTimeMillis();
Log.i("Test", String.format("InsertHelper, Speed: %d ms, Records per second: %.2f", (int)(end-start), 1000*(double)INSERTS/(double)(end-start)));
db.close();
dbFile.delete();
db = SQLiteDatabase.openOrCreateDatabase(dbFile, null);
db.execSQL("CREATE TABLE events (_id integer primary key autoincrement, event_type TEXT NOT NULL, timestamp BIGINT, data TEXT);");
db.execSQL("CREATE INDEX mainIndex ON events (event_type, timestamp ASC);");
start = System.currentTimeMillis();
ContentValues cv = new ContentValues();
for(int i = 0; i < INSERTS; ++i) {
cv.put("event_type", eventType);
cv.put("timestamp", timestamp);
cv.put("data", data);
db.insert("events", null, cv);
}
end = System.currentTimeMillis();
Log.i("Test", String.format("Normal, Speed: %d ms, Records per second: %.2f", end-start, 1000*(double)INSERTS/(double)(end-start)));
db.close();
dbFile.delete();
该数据库与我的真实应用程序使用的数据库完全相同,我尝试删除索引,但没有任何区别。
结果如下:
Nexus One,内部存储器 方法 | 记录 | 时间(毫秒)| 每秒记录数 -------------+---------+------------+-------------- ------ 正常 | 100 | 2072 | 48.26 插入助手 | 100 | 1662 | 60.17 Nexus One,外部存储器: 方法 | 记录 | 时间(毫秒)| 每秒记录数 -------------+---------+------------+-------------- ------ 正常 | 100 | 7390 | 13.53 插入助手 | 100 | 7152 | 13.98 模拟器,内部存储器: 方法 | 记录 | 时间(毫秒)| 每秒记录数 -------------+---------+------------+-------------- ------ 正常 | 100 | 1803 | 55.46 插入助手 | 100 | 3075 | 32.52 仿真器,外部存储器: 方法 | 记录 | 时间(毫秒)| 每秒记录数 -------------+---------+------------+-------------- ------ 正常 | 100 | 5742 | 17.42 插入助手 | 100 | 7164 | 13.96
如您所见,模拟器不能被信任,InsertHelper
如果有的话应该更快。
当然,这是意料之中的,测试主要是出于好奇。
然而,我担心的是我的手机在使用外部存储器时性能不佳,我是否错过了一些关键方面,SQLiteDatabase
或者仅仅是因为 SD 卡会变慢?
我可以在我的真实应用程序中添加它,我禁用了锁定,它几乎没有什么区别。