问题描述
||
我正在使用外部存储器在等待事件发送到服务器时将事件存储在数据库中。
插入记录时,我发现性能确实很差。
我知道外部存储器可能很慢,但是我想查看一些数字,所以我写了一个小应用程序对其进行测试。
这是代码:
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,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,end-start,1000*(double)INSERTS/(double)(end-start)));
db.close();
dbFile.delete();
该数据库与我的实际应用程序使用的数据库完全相同,我尝试删除该索引,但没有任何区别。
结果如下:
Nexus One,内部存储器
方法记录|时间(毫秒)|每秒记录
------------- + --------- + ----------- + -------------- ------
普通| 100 | 2072 | 48.26
InsertHelper | 100 | 1662 | 60.17
Nexus One,外部存储器:
方法记录|时间(毫秒)|每秒记录
------------- + --------- + ----------- + -------------- ------
普通| 100 | 7390 | 13.53
InsertHelper | 100 | 7152 | 13.98
仿真器,内部存储器:
方法记录|时间(毫秒)|每秒记录
------------- + --------- + ----------- + -------------- ------
普通| 100 | 1803 | 55.46
InsertHelper | 100 | 3075 | 32.52
仿真器,外部存储器:
方法记录|时间(毫秒)|每秒记录
------------- + --------- + ----------- + -------------- ------
普通| 100 | 5742 | 17.42
InsertHelper | 100 | 7164 | 13.96
如您所见,仿真器不受信任,如果有的话,InsertHelper
应该更快。
当然,这是可以预期的,测试主要是出于好奇。
但是,我担心的是使用外部存储器时手机的性能不佳,我是否错过了SQLiteDatabase
的某些关键方面,还是仅仅是因为SD卡速度较慢?
我可以在我的真实应用程序中添加我已禁用锁定的功能,它的作用不大。
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)