package mobisocial.musubi.model.helpers; import gnu.trove.list.linked.TLongLinkedList; import java.util.Arrays; import java.util.Date; import java.util.Random; import android.content.ContentValues; import android.database.Cursor; import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteDoneException; import android.database.sqlite.SQLiteOpenHelper; import android.database.sqlite.SQLiteStatement; import android.test.AndroidTestCase; import android.util.Base64; import android.util.Log; /** * This class provides tests that assess the efficiency of various * different ways of accessing the local android SQL database */ public class DBPatternTest extends AndroidTestCase { static final int ITERATIONS = 1000; static class MTest { static final String TABLE = "test"; static final String ID = "_id"; static final String INTEGER = "int_field"; static final String SHORT_STRING = "short_string"; static final String LONG_STRING = "long_string"; static final String SHORT_BYTES = "short_bytes"; static final String LONG_BYTES = "long_bytes"; static final String[] ALL = new String[] { ID, INTEGER, SHORT_STRING, LONG_STRING, SHORT_BYTES, LONG_BYTES }; long id_; long integer_; String shortString_; String longString_; byte[] shortBytes_; byte[] longBytes_; } SQLiteOpenHelper mDatabaseSource; public void setUp() { mDatabaseSource = new SQLiteOpenHelper(getContext(), null, null, 1) { @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { throw new RuntimeException("doesn't make sense yo"); } @Override public void onCreate(SQLiteDatabase db) { db.execSQL( "CREATE TABLE " + MTest.TABLE + " (" + MTest.ID + " INTEGER PRIMARY KEY," + MTest.INTEGER + " INTEGER," + MTest.SHORT_STRING + " STRING," + MTest.LONG_STRING + " STRING," + MTest.SHORT_BYTES + " BLOB," + MTest.LONG_BYTES + " BLOB" + ")" ); } }; } long[] mSequentialOrder; long[] mRandomOrder; void insertTestData(int count, boolean randomOrder, boolean doInt, int doShortStringLength, int doLongStringLength, int doShortByteLength, int doLongBytesLength) { TLongLinkedList ids = new TLongLinkedList(); SQLiteDatabase db = mDatabaseSource.getWritableDatabase(); ContentValues cv = new ContentValues(); Random r = new Random(); byte[] ss = null, ls = null, sb = null, lb = null; if(doShortStringLength >= 0) { ss = new byte[doShortStringLength * 6 / 8]; } if(doLongStringLength >= 0) { ls = new byte[doLongStringLength * 6 / 8]; } if(doShortByteLength >= 0) { sb = new byte[doShortByteLength * 6 / 8]; } if(doShortByteLength >= 0) { lb = new byte[doLongBytesLength * 6 / 8]; } db.beginTransaction(); for(int i = 0; i < count; ++i) { if(randomOrder) { cv.put(MTest.ID, r.nextLong()); } if(doInt) { cv.put(MTest.INTEGER, r.nextLong()); } if(doShortStringLength >= 0) { r.nextBytes(ss); cv.put(MTest.SHORT_STRING, Base64.encodeToString(ss, Base64.DEFAULT)); } if(doLongStringLength >= 0) { r.nextBytes(ls); cv.put(MTest.SHORT_STRING, Base64.encodeToString(ls, Base64.DEFAULT)); } if(doShortByteLength >= 0) { r.nextBytes(sb); cv.put(MTest.SHORT_BYTES, sb); } if(doShortByteLength >= 0) { r.nextBytes(lb); cv.put(MTest.LONG_BYTES, lb); } long id = db.insert(MTest.TABLE, null, cv); ids.add(id); } mRandomOrder = ids.toArray(); Arrays.sort(mRandomOrder); mSequentialOrder = ids.toArray(); db.setTransactionSuccessful(); db.endTransaction(); } public void tearDown() { mDatabaseSource.close(); } public void testCursorAllRandomIntegerMap() { SQLiteDatabase db = mDatabaseSource.getWritableDatabase(); insertTestData(ITERATIONS, true, true, -1, -1, -1, -1); Date s, e; double ms; //////////////////////////////// s = new Date(); for(int i = 0; i < ITERATIONS; ++i) { Cursor c = db.query(MTest.TABLE, MTest.ALL, MTest.ID + "=?", new String[] {String.valueOf(i)}, null, null, null); while(c.moveToNext()) { @SuppressWarnings("unused") long integer = c.getLong(0); } c.close(); } e = new Date(); ms = e.getTime() - s.getTime(); Log.e(getName(), "cursor query all miss ms/op: " + ms / ITERATIONS); //////////////////////////////// s = new Date(); for(int i = 0; i < ITERATIONS; ++i) { Cursor c = db.query(MTest.TABLE, MTest.ALL, MTest.ID + "=?", new String[] {String.valueOf(mSequentialOrder[i])}, null, null, null); while(c.moveToNext()) { @SuppressWarnings("unused") long integer = c.getLong(0); } c.close(); } e = new Date(); ms = e.getTime() - s.getTime(); Log.e(getName(), "cursor query all hit seq ms/op: " + ms / ITERATIONS); //////////////////////////////// s = new Date(); for(int i = 0; i < ITERATIONS; ++i) { Cursor c = db.query(MTest.TABLE, MTest.ALL, MTest.ID + "=?", new String[] {String.valueOf(mRandomOrder[i])}, null, null, null); while(c.moveToNext()) { @SuppressWarnings("unused") long integer = c.getLong(0); } c.close(); } e = new Date(); ms = e.getTime() - s.getTime(); Log.e(getName(), "cursor query all hit rand ms/op: " + ms / ITERATIONS); //////////////////////////////// s = new Date(); for(int i = 0; i < ITERATIONS; ++i) { Cursor c = db.query(MTest.TABLE, MTest.ALL, MTest.ID + "=?", new String[] {String.valueOf(i)}, null, null, null); while(c.moveToNext()) { @SuppressWarnings("unused") long integer = c.getLong(c.getColumnIndexOrThrow(MTest.ID)); } c.close(); } e = new Date(); ms = e.getTime() - s.getTime(); Log.e(getName(), "cursor query all by name miss ms/op: " + ms / ITERATIONS); //////////////////////////////// s = new Date(); for(int i = 0; i < ITERATIONS; ++i) { Cursor c = db.query(MTest.TABLE, MTest.ALL, MTest.ID + "=?", new String[] {String.valueOf(mSequentialOrder[i])}, null, null, null); while(c.moveToNext()) { @SuppressWarnings("unused") long integer = c.getLong(c.getColumnIndexOrThrow(MTest.ID)); } c.close(); } e = new Date(); ms = e.getTime() - s.getTime(); Log.e(getName(), "cursor query all by name hit seq ms/op: " + ms / ITERATIONS); //////////////////////////////// s = new Date(); for(int i = 0; i < ITERATIONS; ++i) { Cursor c = db.query(MTest.TABLE, MTest.ALL, MTest.ID + "=?", new String[] {String.valueOf(mRandomOrder[i])}, null, null, null); while(c.moveToNext()) { @SuppressWarnings("unused") long integer = c.getLong(c.getColumnIndexOrThrow(MTest.ID)); } c.close(); } e = new Date(); ms = e.getTime() - s.getTime(); Log.e(getName(), "cursor query all by name hit rand ms/op: " + ms / ITERATIONS); } public void testCursorAllRandomIntegerFull() { SQLiteDatabase db = mDatabaseSource.getWritableDatabase(); insertTestData(ITERATIONS, true, true, -1, -1, -1, -1); Date s, e; double ms; int ITERATIONS = DBPatternTest.ITERATIONS / 1000; //////////////////////////////// s = new Date(); for(int i = 0; i < ITERATIONS; ++i) { Cursor c = db.query(MTest.TABLE, MTest.ALL, null, null, null, null, null); while(c.moveToNext()) { @SuppressWarnings("unused") long integer = c.getLong(0); } c.close(); } e = new Date(); ms = e.getTime() - s.getTime(); Log.e(getName(), "cursor full all miss ms/op: " + ms / ITERATIONS); //////////////////////////////// s = new Date(); for(int i = 0; i < ITERATIONS; ++i) { Cursor c = db.query(MTest.TABLE, MTest.ALL, null, null, null, null, null); while(c.moveToNext()) { @SuppressWarnings("unused") long integer = c.getLong(0); } c.close(); } e = new Date(); ms = e.getTime() - s.getTime(); Log.e(getName(), "cursor full all hit seq ms/op: " + ms / ITERATIONS); //////////////////////////////// s = new Date(); for(int i = 0; i < ITERATIONS; ++i) { Cursor c = db.query(MTest.TABLE, MTest.ALL, null, null, null, null, null); while(c.moveToNext()) { @SuppressWarnings("unused") long integer = c.getLong(0); } c.close(); } e = new Date(); ms = e.getTime() - s.getTime(); Log.e(getName(), "cursor full all hit rand ms/op: " + ms / ITERATIONS); //////////////////////////////// s = new Date(); for(int i = 0; i < ITERATIONS; ++i) { Cursor c = db.query(MTest.TABLE, MTest.ALL, null, null, null, null, null); while(c.moveToNext()) { @SuppressWarnings("unused") long integer = c.getLong(c.getColumnIndexOrThrow(MTest.ID)); } c.close(); } e = new Date(); ms = e.getTime() - s.getTime(); Log.e(getName(), "cursor full all by name miss ms/op: " + ms / ITERATIONS); //////////////////////////////// s = new Date(); for(int i = 0; i < ITERATIONS; ++i) { Cursor c = db.query(MTest.TABLE, MTest.ALL, null, null, null, null, null); while(c.moveToNext()) { @SuppressWarnings("unused") long integer = c.getLong(c.getColumnIndexOrThrow(MTest.ID)); } c.close(); } e = new Date(); ms = e.getTime() - s.getTime(); Log.e(getName(), "cursor full all by name hit seq ms/op: " + ms / ITERATIONS); //////////////////////////////// s = new Date(); for(int i = 0; i < ITERATIONS; ++i) { Cursor c = db.query(MTest.TABLE, MTest.ALL, null, null, null, null, null); while(c.moveToNext()) { @SuppressWarnings("unused") long integer = c.getLong(c.getColumnIndexOrThrow(MTest.ID)); } c.close(); } e = new Date(); ms = e.getTime() - s.getTime(); Log.e(getName(), "cursor full all by name hit rand ms/op: " + ms / ITERATIONS); } public void testCursorRandomIntegerMap() { SQLiteDatabase db = mDatabaseSource.getWritableDatabase(); insertTestData(ITERATIONS, true, true, -1, -1, -1, -1); Date s, e; double ms; //////////////////////////////// s = new Date(); for(int i = 0; i < ITERATIONS; ++i) { Cursor c = db.query(MTest.TABLE, new String[] {MTest.ID}, MTest.ID + "=?", new String[] {String.valueOf(i)}, null, null, null); while(c.moveToNext()) { @SuppressWarnings("unused") long integer = c.getLong(0); } c.close(); } e = new Date(); ms = e.getTime() - s.getTime(); Log.e(getName(), "cursor query miss ms/op: " + ms / ITERATIONS); //////////////////////////////// s = new Date(); for(int i = 0; i < ITERATIONS; ++i) { Cursor c = db.query(MTest.TABLE, new String[] {MTest.ID}, MTest.ID + "=?", new String[] {String.valueOf(mSequentialOrder[i])}, null, null, null); while(c.moveToNext()) { @SuppressWarnings("unused") long integer = c.getLong(0); } c.close(); } e = new Date(); ms = e.getTime() - s.getTime(); Log.e(getName(), "cursor query hit seq ms/op: " + ms / ITERATIONS); //////////////////////////////// s = new Date(); for(int i = 0; i < ITERATIONS; ++i) { Cursor c = db.query(MTest.TABLE, new String[] {MTest.ID}, MTest.ID + "=?", new String[] {String.valueOf(mRandomOrder[i])}, null, null, null); while(c.moveToNext()) { @SuppressWarnings("unused") long integer = c.getLong(0); } c.close(); } e = new Date(); ms = e.getTime() - s.getTime(); Log.e(getName(), "cursor query hit rand ms/op: " + ms / ITERATIONS); //////////////////////////////// s = new Date(); for(int i = 0; i < ITERATIONS; ++i) { Cursor c = db.query(MTest.TABLE, new String[] {MTest.ID}, MTest.ID + "=?", new String[] {String.valueOf(i)}, null, null, null); while(c.moveToNext()) { @SuppressWarnings("unused") long integer = c.getLong(c.getColumnIndexOrThrow(MTest.ID)); } c.close(); } e = new Date(); ms = e.getTime() - s.getTime(); Log.e(getName(), "cursor query by name miss ms/op: " + ms / ITERATIONS); //////////////////////////////// s = new Date(); for(int i = 0; i < ITERATIONS; ++i) { Cursor c = db.query(MTest.TABLE, new String[] {MTest.ID}, MTest.ID + "=?", new String[] {String.valueOf(mSequentialOrder[i])}, null, null, null); while(c.moveToNext()) { @SuppressWarnings("unused") long integer = c.getLong(c.getColumnIndexOrThrow(MTest.ID)); } c.close(); } e = new Date(); ms = e.getTime() - s.getTime(); Log.e(getName(), "cursor query by name hit seq ms/op: " + ms / ITERATIONS); //////////////////////////////// s = new Date(); for(int i = 0; i < ITERATIONS; ++i) { Cursor c = db.query(MTest.TABLE, new String[] {MTest.ID}, MTest.ID + "=?", new String[] {String.valueOf(mRandomOrder[i])}, null, null, null); while(c.moveToNext()) { @SuppressWarnings("unused") long integer = c.getLong(c.getColumnIndexOrThrow(MTest.ID)); } c.close(); } e = new Date(); ms = e.getTime() - s.getTime(); Log.e(getName(), "cursor query by name hit rand ms/op: " + ms / ITERATIONS); } public void testCursorRandomIntegerFull() { SQLiteDatabase db = mDatabaseSource.getWritableDatabase(); insertTestData(ITERATIONS, true, true, -1, -1, -1, -1); int ITERATIONS = DBPatternTest.ITERATIONS / 1000; Date s, e; double ms; //////////////////////////////// s = new Date(); for(int i = 0; i < ITERATIONS; ++i) { Cursor c = db.query(MTest.TABLE, MTest.ALL, null, null, null, null, null); while(c.moveToNext()) { @SuppressWarnings("unused") long integer = c.getLong(0); } c.close(); } e = new Date(); ms = e.getTime() - s.getTime(); Log.e(getName(), "cursor full miss ms/op: " + ms / ITERATIONS); //////////////////////////////// s = new Date(); for(int i = 0; i < ITERATIONS; ++i) { Cursor c = db.query(MTest.TABLE, MTest.ALL, null, null, null, null, null); while(c.moveToNext()) { @SuppressWarnings("unused") long integer = c.getLong(0); } c.close(); } e = new Date(); ms = e.getTime() - s.getTime(); Log.e(getName(), "cursor full hit seq ms/op: " + ms / ITERATIONS); //////////////////////////////// s = new Date(); for(int i = 0; i < ITERATIONS; ++i) { Cursor c = db.query(MTest.TABLE, MTest.ALL, null, null, null, null, null); while(c.moveToNext()) { @SuppressWarnings("unused") long integer = c.getLong(0); } c.close(); } e = new Date(); ms = e.getTime() - s.getTime(); Log.e(getName(), "cursor full hit rand ms/op: " + ms / ITERATIONS); //////////////////////////////// s = new Date(); for(int i = 0; i < ITERATIONS; ++i) { Cursor c = db.query(MTest.TABLE, MTest.ALL, null, null, null, null, null); while(c.moveToNext()) { @SuppressWarnings("unused") long integer = c.getLong(c.getColumnIndexOrThrow(MTest.ID)); } c.close(); } e = new Date(); ms = e.getTime() - s.getTime(); Log.e(getName(), "cursor full by name miss ms/op: " + ms / ITERATIONS); //////////////////////////////// s = new Date(); for(int i = 0; i < ITERATIONS; ++i) { Cursor c = db.query(MTest.TABLE, MTest.ALL, null, null, null, null, null); while(c.moveToNext()) { @SuppressWarnings("unused") long integer = c.getLong(c.getColumnIndexOrThrow(MTest.ID)); } c.close(); } e = new Date(); ms = e.getTime() - s.getTime(); Log.e(getName(), "cursor full by name hit seq ms/op: " + ms / ITERATIONS); //////////////////////////////// s = new Date(); for(int i = 0; i < ITERATIONS; ++i) { Cursor c = db.query(MTest.TABLE, MTest.ALL, null, null, null, null, null); while(c.moveToNext()) { @SuppressWarnings("unused") long integer = c.getLong(c.getColumnIndexOrThrow(MTest.ID)); } c.close(); } e = new Date(); ms = e.getTime() - s.getTime(); Log.e(getName(), "cursor full by name hit rand ms/op: " + ms / ITERATIONS); } public void testCursorRawRandomIntegerMap() { SQLiteDatabase db = mDatabaseSource.getWritableDatabase(); insertTestData(ITERATIONS, true, true, -1, -1, -1, -1); Date s, e; double ms; //////////////////////////////// s = new Date(); for(int i = 0; i < ITERATIONS; ++i) { Cursor c = db.rawQuery("SELECT " + MTest.ID + " FROM " + MTest.TABLE + " WHERE " + MTest.ID + "=?", new String[] {String.valueOf(i)}); while(c.moveToNext()) { @SuppressWarnings("unused") long integer = c.getLong(0); } c.close(); } e = new Date(); ms = e.getTime() - s.getTime(); Log.e(getName(), "cursor raw query miss ms/op: " + ms / ITERATIONS); //////////////////////////////// s = new Date(); for(int i = 0; i < ITERATIONS; ++i) { Cursor c = db.rawQuery("SELECT " + MTest.ID + " FROM " + MTest.TABLE + " WHERE " + MTest.ID + "=?", new String[] {String.valueOf(mSequentialOrder[i])}); while(c.moveToNext()) { @SuppressWarnings("unused") long integer = c.getLong(0); } c.close(); } e = new Date(); ms = e.getTime() - s.getTime(); Log.e(getName(), "cursor raw query hit seq ms/op: " + ms / ITERATIONS); //////////////////////////////// s = new Date(); for(int i = 0; i < ITERATIONS; ++i) { Cursor c = db.rawQuery("SELECT " + MTest.ID + " FROM " + MTest.TABLE + " WHERE " + MTest.ID + "=?", new String[] {String.valueOf(mRandomOrder[i])}); while(c.moveToNext()) { @SuppressWarnings("unused") long integer = c.getLong(0); } c.close(); } e = new Date(); ms = e.getTime() - s.getTime(); Log.e(getName(), "cursor raw query hit rand ms/op: " + ms / ITERATIONS); //////////////////////////////// s = new Date(); for(int i = 0; i < ITERATIONS; ++i) { Cursor c = db.rawQuery("SELECT " + MTest.ID + " FROM " + MTest.TABLE + " WHERE " + MTest.ID + "=?", new String[] {String.valueOf(i)}); while(c.moveToNext()) { @SuppressWarnings("unused") long integer = c.getLong(c.getColumnIndexOrThrow(MTest.ID)); } c.close(); } e = new Date(); ms = e.getTime() - s.getTime(); Log.e(getName(), "cursor raw query by name miss ms/op: " + ms / ITERATIONS); //////////////////////////////// s = new Date(); for(int i = 0; i < ITERATIONS; ++i) { Cursor c = db.rawQuery("SELECT " + MTest.ID + " FROM " + MTest.TABLE + " WHERE " + MTest.ID + "=?", new String[] {String.valueOf(mSequentialOrder[i])}); while(c.moveToNext()) { @SuppressWarnings("unused") long integer = c.getLong(c.getColumnIndexOrThrow(MTest.ID)); } c.close(); } e = new Date(); ms = e.getTime() - s.getTime(); Log.e(getName(), "cursor raw query by name hit seq ms/op: " + ms / ITERATIONS); //////////////////////////////// s = new Date(); for(int i = 0; i < ITERATIONS; ++i) { Cursor c = db.rawQuery("SELECT " + MTest.ID + " FROM " + MTest.TABLE + " WHERE " + MTest.ID + "=?", new String[] {String.valueOf(mRandomOrder[i])}); while(c.moveToNext()) { @SuppressWarnings("unused") long integer = c.getLong(c.getColumnIndexOrThrow(MTest.ID)); } c.close(); } e = new Date(); ms = e.getTime() - s.getTime(); Log.e(getName(), "cursor raw query by name hit rand ms/op: " + ms / ITERATIONS); } public void testCursorRawRandomIntegerFull() { SQLiteDatabase db = mDatabaseSource.getWritableDatabase(); insertTestData(ITERATIONS, true, true, -1, -1, -1, -1); Date s, e; double ms; int ITERATIONS = DBPatternTest.ITERATIONS / 1000; //////////////////////////////// s = new Date(); for(int i = 0; i < ITERATIONS; ++i) { Cursor c = db.rawQuery("SELECT " + MTest.ID + " FROM " + MTest.TABLE, null); while(c.moveToNext()) { @SuppressWarnings("unused") long integer = c.getLong(0); } c.close(); } e = new Date(); ms = e.getTime() - s.getTime(); Log.e(getName(), "cursor raw query miss ms/op: " + ms / ITERATIONS); //////////////////////////////// s = new Date(); for(int i = 0; i < ITERATIONS; ++i) { Cursor c = db.rawQuery("SELECT " + MTest.ID + " FROM " + MTest.TABLE, null); while(c.moveToNext()) { @SuppressWarnings("unused") long integer = c.getLong(0); } c.close(); } e = new Date(); ms = e.getTime() - s.getTime(); Log.e(getName(), "cursor raw query hit seq ms/op: " + ms / ITERATIONS); //////////////////////////////// s = new Date(); for(int i = 0; i < ITERATIONS; ++i) { Cursor c = db.rawQuery("SELECT " + MTest.ID + " FROM " + MTest.TABLE, null); while(c.moveToNext()) { @SuppressWarnings("unused") long integer = c.getLong(0); } c.close(); } e = new Date(); ms = e.getTime() - s.getTime(); Log.e(getName(), "cursor raw query hit rand ms/op: " + ms / ITERATIONS); //////////////////////////////// s = new Date(); for(int i = 0; i < ITERATIONS; ++i) { Cursor c = db.rawQuery("SELECT " + MTest.ID + " FROM " + MTest.TABLE, null); while(c.moveToNext()) { @SuppressWarnings("unused") long integer = c.getLong(c.getColumnIndexOrThrow(MTest.ID)); } c.close(); } e = new Date(); ms = e.getTime() - s.getTime(); Log.e(getName(), "cursor raw query by name miss ms/op: " + ms / ITERATIONS); //////////////////////////////// s = new Date(); for(int i = 0; i < ITERATIONS; ++i) { Cursor c = db.rawQuery("SELECT " + MTest.ID + " FROM " + MTest.TABLE, null); while(c.moveToNext()) { @SuppressWarnings("unused") long integer = c.getLong(c.getColumnIndexOrThrow(MTest.ID)); } c.close(); } e = new Date(); ms = e.getTime() - s.getTime(); Log.e(getName(), "cursor raw query by name hit seq ms/op: " + ms / ITERATIONS); //////////////////////////////// s = new Date(); for(int i = 0; i < ITERATIONS; ++i) { Cursor c = db.rawQuery("SELECT " + MTest.ID + " FROM " + MTest.TABLE, null); while(c.moveToNext()) { @SuppressWarnings("unused") long integer = c.getLong(c.getColumnIndexOrThrow(MTest.ID)); } c.close(); } e = new Date(); ms = e.getTime() - s.getTime(); Log.e(getName(), "cursor raw query by name hit rand ms/op: " + ms / ITERATIONS); } public void testCompiledsRandomIntegerMap() { SQLiteDatabase db = mDatabaseSource.getWritableDatabase(); SQLiteStatement st = db.compileStatement("SELECT " + MTest.ID + " FROM " + MTest.TABLE + " WHERE " + MTest.ID + "=?"); insertTestData(ITERATIONS, true, true, -1, -1, -1, -1); Date s, e; double ms; //////////////////////////////// s = new Date(); for(int i = 0; i < ITERATIONS; ++i) { st.bindLong(1, i); try { @SuppressWarnings("unused") long integer = st.simpleQueryForLong(); } catch (SQLiteDoneException x){} } e = new Date(); ms = e.getTime() - s.getTime(); Log.e(getName(), "compiled query miss ms/op: " + ms / ITERATIONS); //////////////////////////////// s = new Date(); for(int i = 0; i < ITERATIONS; ++i) { st.bindLong(1, mSequentialOrder[i]); @SuppressWarnings("unused") long integer = st.simpleQueryForLong(); } e = new Date(); ms = e.getTime() - s.getTime(); Log.e(getName(), "compiled query hit seq ms/op: " + ms / ITERATIONS); //////////////////////////////// s = new Date(); for(int i = 0; i < ITERATIONS; ++i) { st.bindLong(1, mRandomOrder[i]); @SuppressWarnings("unused") long integer = st.simpleQueryForLong(); } e = new Date(); ms = e.getTime() - s.getTime(); Log.e(getName(), "compiled query hit rand ms/op: " + ms / ITERATIONS); } public void testWithExtrasCursorAllRandomIntegerMap() { SQLiteDatabase db = mDatabaseSource.getWritableDatabase(); insertTestData(ITERATIONS, true, true, -1, -1, -1, 2048); Date s, e; double ms; //////////////////////////////// s = new Date(); for(int i = 0; i < ITERATIONS; ++i) { Cursor c = db.query(MTest.TABLE, MTest.ALL, MTest.ID + "=?", new String[] {String.valueOf(i)}, null, null, null); while(c.moveToNext()) { @SuppressWarnings("unused") long integer = c.getLong(0); @SuppressWarnings("unused") byte[] r = c.getBlob(5); } c.close(); } e = new Date(); ms = e.getTime() - s.getTime(); Log.e(getName(), "cursor query all (~2k+) miss ms/op: " + ms / ITERATIONS); //////////////////////////////// s = new Date(); for(int i = 0; i < ITERATIONS; ++i) { Cursor c = db.query(MTest.TABLE, MTest.ALL, MTest.ID + "=?", new String[] {String.valueOf(mSequentialOrder[i])}, null, null, null); while(c.moveToNext()) { @SuppressWarnings("unused") long integer = c.getLong(0); @SuppressWarnings("unused") byte[] r = c.getBlob(5); } c.close(); } e = new Date(); ms = e.getTime() - s.getTime(); Log.e(getName(), "cursor query all (~2k+) hit seq ms/op: " + ms / ITERATIONS); //////////////////////////////// s = new Date(); for(int i = 0; i < ITERATIONS; ++i) { Cursor c = db.query(MTest.TABLE, MTest.ALL, MTest.ID + "=?", new String[] {String.valueOf(mRandomOrder[i])}, null, null, null); while(c.moveToNext()) { @SuppressWarnings("unused") long integer = c.getLong(0); @SuppressWarnings("unused") byte[] r = c.getBlob(5); } c.close(); } e = new Date(); ms = e.getTime() - s.getTime(); Log.e(getName(), "cursor query all (~2k+) hit rand ms/op: " + ms / ITERATIONS); //////////////////////////////// s = new Date(); for(int i = 0; i < ITERATIONS; ++i) { Cursor c = db.query(MTest.TABLE, MTest.ALL, MTest.ID + "=?", new String[] {String.valueOf(i)}, null, null, null); while(c.moveToNext()) { @SuppressWarnings("unused") long integer = c.getLong(c.getColumnIndexOrThrow(MTest.ID)); @SuppressWarnings("unused") byte[] r = c.getBlob(5); } c.close(); } e = new Date(); ms = e.getTime() - s.getTime(); Log.e(getName(), "cursor query all (~2k+) by name miss ms/op: " + ms / ITERATIONS); //////////////////////////////// s = new Date(); for(int i = 0; i < ITERATIONS; ++i) { Cursor c = db.query(MTest.TABLE, MTest.ALL, MTest.ID + "=?", new String[] {String.valueOf(mSequentialOrder[i])}, null, null, null); while(c.moveToNext()) { @SuppressWarnings("unused") long integer = c.getLong(c.getColumnIndexOrThrow(MTest.ID)); @SuppressWarnings("unused") byte[] r = c.getBlob(5); } c.close(); } e = new Date(); ms = e.getTime() - s.getTime(); Log.e(getName(), "cursor query all (~2k+) by name hit seq ms/op: " + ms / ITERATIONS); //////////////////////////////// s = new Date(); for(int i = 0; i < ITERATIONS; ++i) { Cursor c = db.query(MTest.TABLE, MTest.ALL, MTest.ID + "=?", new String[] {String.valueOf(mRandomOrder[i])}, null, null, null); while(c.moveToNext()) { @SuppressWarnings("unused") long integer = c.getLong(c.getColumnIndexOrThrow(MTest.ID)); @SuppressWarnings("unused") byte[] r = c.getBlob(5); } c.close(); } e = new Date(); ms = e.getTime() - s.getTime(); Log.e(getName(), "cursor query all (~2k+) by name hit rand ms/op: " + ms / ITERATIONS); } public void testWithExtrasStringCursorAllRandomIntegerMap() { SQLiteDatabase db = mDatabaseSource.getWritableDatabase(); insertTestData(ITERATIONS, true, true, 32, 2048, -1, -1); Date s, e; double ms; //////////////////////////////// s = new Date(); for(int i = 0; i < ITERATIONS; ++i) { Cursor c = db.query(MTest.TABLE, MTest.ALL, MTest.ID + "=?", new String[] {String.valueOf(i)}, null, null, null); while(c.moveToNext()) { @SuppressWarnings("unused") long integer = c.getLong(0); @SuppressWarnings("unused") String r = c.getString(3); } c.close(); } e = new Date(); ms = e.getTime() - s.getTime(); Log.e(getName(), "cursor query all (~2k+s) miss ms/op: " + ms / ITERATIONS); //////////////////////////////// s = new Date(); for(int i = 0; i < ITERATIONS; ++i) { Cursor c = db.query(MTest.TABLE, MTest.ALL, MTest.ID + "=?", new String[] {String.valueOf(mSequentialOrder[i])}, null, null, null); while(c.moveToNext()) { @SuppressWarnings("unused") long integer = c.getLong(0); @SuppressWarnings("unused") String r = c.getString(3); } c.close(); } e = new Date(); ms = e.getTime() - s.getTime(); Log.e(getName(), "cursor query all (~2k+s) hit seq ms/op: " + ms / ITERATIONS); //////////////////////////////// s = new Date(); for(int i = 0; i < ITERATIONS; ++i) { Cursor c = db.query(MTest.TABLE, MTest.ALL, MTest.ID + "=?", new String[] {String.valueOf(mRandomOrder[i])}, null, null, null); while(c.moveToNext()) { @SuppressWarnings("unused") long integer = c.getLong(0); @SuppressWarnings("unused") String r = c.getString(3); } c.close(); } e = new Date(); ms = e.getTime() - s.getTime(); Log.e(getName(), "cursor query all (~2k+s) hit rand ms/op: " + ms / ITERATIONS); //////////////////////////////// s = new Date(); for(int i = 0; i < ITERATIONS; ++i) { Cursor c = db.query(MTest.TABLE, MTest.ALL, MTest.ID + "=?", new String[] {String.valueOf(i)}, null, null, null); while(c.moveToNext()) { @SuppressWarnings("unused") long integer = c.getLong(c.getColumnIndexOrThrow(MTest.ID)); @SuppressWarnings("unused") String r = c.getString(3); } c.close(); } e = new Date(); ms = e.getTime() - s.getTime(); Log.e(getName(), "cursor query all (~2k+s) by name miss ms/op: " + ms / ITERATIONS); //////////////////////////////// s = new Date(); for(int i = 0; i < ITERATIONS; ++i) { Cursor c = db.query(MTest.TABLE, MTest.ALL, MTest.ID + "=?", new String[] {String.valueOf(mSequentialOrder[i])}, null, null, null); while(c.moveToNext()) { @SuppressWarnings("unused") long integer = c.getLong(c.getColumnIndexOrThrow(MTest.ID)); @SuppressWarnings("unused") String r = c.getString(3); } c.close(); } e = new Date(); ms = e.getTime() - s.getTime(); Log.e(getName(), "cursor query all (~2k+s) by name hit seq ms/op: " + ms / ITERATIONS); //////////////////////////////// s = new Date(); for(int i = 0; i < ITERATIONS; ++i) { Cursor c = db.query(MTest.TABLE, MTest.ALL, MTest.ID + "=?", new String[] {String.valueOf(mRandomOrder[i])}, null, null, null); while(c.moveToNext()) { @SuppressWarnings("unused") long integer = c.getLong(c.getColumnIndexOrThrow(MTest.ID)); @SuppressWarnings("unused") String r = c.getString(3); } c.close(); } e = new Date(); ms = e.getTime() - s.getTime(); Log.e(getName(), "cursor query all (~2k+s) by name hit rand ms/op: " + ms / ITERATIONS); } }