| /* |
| * Copyright (C) 2007 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| package android.database; |
| |
| import junit.framework.Assert; |
| |
| import android.content.ContentValues; |
| import android.content.Context; |
| import android.database.Cursor; |
| import android.database.sqlite.SQLiteDatabase; |
| import android.provider.Contacts; |
| import android.provider.Contacts.People; |
| import android.test.PerformanceTestCase; |
| import android.test.TestCase; |
| |
| import java.io.File; |
| import java.util.Random; |
| |
| /** |
| * Database Performance Tests |
| * |
| */ |
| |
| @SuppressWarnings("deprecation") |
| public class DatabasePerformanceTests { |
| |
| public static String[] children() { |
| return new String[] { |
| ContactReadingTest1.class.getName(), |
| Perf1Test.class.getName(), |
| Perf2Test.class.getName(), |
| Perf3Test.class.getName(), |
| Perf4Test.class.getName(), |
| Perf5Test.class.getName(), |
| Perf6Test.class.getName(), |
| Perf7Test.class.getName(), |
| Perf8Test.class.getName(), |
| Perf9Test.class.getName(), |
| Perf10Test.class.getName(), |
| Perf11Test.class.getName(), |
| Perf12Test.class.getName(), |
| Perf13Test.class.getName(), |
| Perf14Test.class.getName(), |
| Perf15Test.class.getName(), |
| Perf16Test.class.getName(), |
| Perf17Test.class.getName(), |
| Perf18Test.class.getName(), |
| Perf19Test.class.getName(), |
| Perf20Test.class.getName(), |
| Perf21Test.class.getName(), |
| Perf22Test.class.getName(), |
| Perf23Test.class.getName(), |
| Perf24Test.class.getName(), |
| Perf25Test.class.getName(), |
| Perf26Test.class.getName(), |
| Perf27Test.class.getName(), |
| Perf28Test.class.getName(), |
| Perf29Test.class.getName(), |
| Perf30Test.class.getName(), |
| Perf31Test.class.getName(), |
| }; |
| } |
| |
| public static abstract class PerformanceBase implements TestCase, |
| PerformanceTestCase { |
| protected static final int CURRENT_DATABASE_VERSION = 42; |
| protected SQLiteDatabase mDatabase; |
| protected File mDatabaseFile; |
| protected Context mContext; |
| |
| public void setUp(Context c) { |
| mContext = c; |
| mDatabaseFile = new File("/tmp", "perf_database_test.db"); |
| if (mDatabaseFile.exists()) { |
| mDatabaseFile.delete(); |
| } |
| mDatabase = SQLiteDatabase.openOrCreateDatabase(mDatabaseFile.getPath(), null); |
| Assert.assertTrue(mDatabase != null); |
| mDatabase.setVersion(CURRENT_DATABASE_VERSION); |
| } |
| |
| public void tearDown() { |
| mDatabase.close(); |
| mDatabaseFile.delete(); |
| } |
| |
| public boolean isPerformanceOnly() { |
| return true; |
| } |
| |
| // These test can only be run once. |
| public int startPerformance(Intermediates intermediates) { |
| return 0; |
| } |
| |
| public void run() { |
| } |
| |
| public String numberName(int number) { |
| String result = ""; |
| |
| if (number >= 1000) { |
| result += numberName((number / 1000)) + " thousand"; |
| number = (number % 1000); |
| |
| if (number > 0) result += " "; |
| } |
| |
| if (number >= 100) { |
| result += ONES[(number / 100)] + " hundred"; |
| number = (number % 100); |
| |
| if (number > 0) result += " "; |
| } |
| |
| if (number >= 20) { |
| result += TENS[(number / 10)]; |
| number = (number % 10); |
| |
| if (number > 0) result += " "; |
| } |
| |
| if (number > 0) { |
| result += ONES[number]; |
| } |
| |
| return result; |
| } |
| } |
| |
| /** |
| * Test reading all contact data. |
| */ |
| public static class ContactReadingTest1 implements TestCase, PerformanceTestCase { |
| private static final String[] PEOPLE_PROJECTION = new String[] { |
| Contacts.People._ID, // 0 |
| Contacts.People.PRIMARY_PHONE_ID, // 1 |
| Contacts.People.TYPE, // 2 |
| Contacts.People.NUMBER, // 3 |
| Contacts.People.LABEL, // 4 |
| Contacts.People.NAME, // 5 |
| Contacts.People.PRESENCE_STATUS, // 6 |
| }; |
| |
| private Cursor mCursor; |
| |
| public void setUp(Context c) { |
| mCursor = c.getContentResolver().query(People.CONTENT_URI, PEOPLE_PROJECTION, null, |
| null, People.DEFAULT_SORT_ORDER); |
| } |
| |
| public void tearDown() { |
| mCursor.close(); |
| } |
| |
| public boolean isPerformanceOnly() { |
| return true; |
| } |
| |
| public int startPerformance(Intermediates intermediates) { |
| // This test can only be run once. |
| return 0; |
| } |
| |
| public void run() { |
| while (mCursor.moveToNext()) { |
| // Read out all of the data |
| mCursor.getLong(0); |
| mCursor.getLong(1); |
| mCursor.getLong(2); |
| mCursor.getString(3); |
| mCursor.getString(4); |
| mCursor.getString(5); |
| mCursor.getLong(6); |
| } |
| } |
| } |
| |
| /** |
| * Test 1000 inserts |
| */ |
| |
| public static class Perf1Test extends PerformanceBase { |
| private static final int SIZE = 1000; |
| |
| private String[] statements = new String[SIZE]; |
| |
| @Override |
| public void setUp(Context c) { |
| super.setUp(c); |
| Random random = new Random(42); |
| |
| for (int i = 0; i < SIZE; i++) { |
| int r = random.nextInt(100000); |
| statements[i] = |
| "INSERT INTO t1 VALUES(" + i + "," + r + ",'" |
| + numberName(r) + "')"; |
| } |
| |
| mDatabase |
| .execSQL("CREATE TABLE t1(a INTEGER, b INTEGER, c VARCHAR(100))"); |
| } |
| |
| @Override |
| public void run() { |
| for (int i = 0; i < SIZE; i++) { |
| mDatabase.execSQL(statements[i]); |
| } |
| } |
| } |
| |
| /** |
| * Test 1000 inserts into and indexed table |
| */ |
| |
| public static class Perf2Test extends PerformanceBase { |
| private static final int SIZE = 1000; |
| |
| private String[] statements = new String[SIZE]; |
| |
| @Override |
| public void setUp(Context c) { |
| super.setUp(c); |
| Random random = new Random(42); |
| |
| for (int i = 0; i < SIZE; i++) { |
| int r = random.nextInt(100000); |
| statements[i] = |
| "INSERT INTO t1 VALUES(" + i + "," + r + ",'" |
| + numberName(r) + "')"; |
| } |
| |
| mDatabase |
| .execSQL("CREATE TABLE t1(a INTEGER, b INTEGER, c VARCHAR(100))"); |
| mDatabase.execSQL("CREATE INDEX i1c ON t1(c)"); |
| } |
| |
| @Override |
| public void run() { |
| for (int i = 0; i < SIZE; i++) { |
| mDatabase.execSQL(statements[i]); |
| } |
| } |
| } |
| |
| /** |
| * 100 SELECTs without an index |
| */ |
| |
| public static class Perf3Test extends PerformanceBase { |
| private static final int SIZE = 100; |
| private static final String[] COLUMNS = {"count(*)", "avg(b)"}; |
| |
| private String[] where = new String[SIZE]; |
| |
| @Override |
| public void setUp(Context c) { |
| super.setUp(c); |
| Random random = new Random(42); |
| |
| mDatabase |
| .execSQL("CREATE TABLE t1(a INTEGER, b INTEGER, c VARCHAR(100))"); |
| |
| for (int i = 0; i < SIZE; i++) { |
| int r = random.nextInt(100000); |
| mDatabase.execSQL("INSERT INTO t1 VALUES(" + i + "," + r + ",'" |
| + numberName(r) + "')"); |
| } |
| |
| for (int i = 0; i < SIZE; i++) { |
| int lower = i * 100; |
| int upper = (i + 10) * 100; |
| where[i] = "b >= " + lower + " AND b < " + upper; |
| } |
| } |
| |
| @Override |
| public void run() { |
| for (int i = 0; i < SIZE; i++) { |
| mDatabase |
| .query("t1", COLUMNS, where[i], null, null, null, null); |
| } |
| } |
| } |
| |
| /** |
| * 100 SELECTs on a string comparison |
| */ |
| |
| public static class Perf4Test extends PerformanceBase { |
| private static final int SIZE = 100; |
| private static final String[] COLUMNS = {"count(*)", "avg(b)"}; |
| |
| private String[] where = new String[SIZE]; |
| |
| @Override |
| public void setUp(Context c) { |
| super.setUp(c); |
| Random random = new Random(42); |
| |
| mDatabase |
| .execSQL("CREATE TABLE t1(a INTEGER, b INTEGER, c VARCHAR(100))"); |
| |
| for (int i = 0; i < SIZE; i++) { |
| int r = random.nextInt(100000); |
| mDatabase.execSQL("INSERT INTO t1 VALUES(" + i + "," + r + ",'" |
| + numberName(r) + "')"); |
| } |
| |
| for (int i = 0; i < SIZE; i++) { |
| where[i] = "c LIKE '" + numberName(i) + "'"; |
| } |
| } |
| |
| @Override |
| public void run() { |
| for (int i = 0; i < SIZE; i++) { |
| mDatabase |
| .query("t1", COLUMNS, where[i], null, null, null, null); |
| } |
| } |
| } |
| |
| /** |
| * 100 SELECTs with an index |
| */ |
| |
| public static class Perf5Test extends PerformanceBase { |
| private static final int SIZE = 100; |
| private static final String[] COLUMNS = {"count(*)", "avg(b)"}; |
| |
| private String[] where = new String[SIZE]; |
| |
| @Override |
| public void setUp(Context c) { |
| super.setUp(c); |
| Random random = new Random(42); |
| |
| mDatabase |
| .execSQL("CREATE TABLE t1(a INTEGER, b INTEGER, c VARCHAR(100))"); |
| mDatabase.execSQL("CREATE INDEX i1b ON t1(b)"); |
| |
| for (int i = 0; i < SIZE; i++) { |
| int r = random.nextInt(100000); |
| mDatabase.execSQL("INSERT INTO t1 VALUES(" + i + "," + r + ",'" |
| + numberName(r) + "')"); |
| } |
| |
| for (int i = 0; i < SIZE; i++) { |
| int lower = i * 100; |
| int upper = (i + 10) * 100; |
| where[i] = "b >= " + lower + " AND b < " + upper; |
| } |
| } |
| |
| @Override |
| public void run() { |
| for (int i = 0; i < SIZE; i++) { |
| mDatabase |
| .query("t1", COLUMNS, where[i], null, null, null, null); |
| } |
| } |
| } |
| |
| /** |
| * INNER JOIN without an index |
| */ |
| |
| public static class Perf6Test extends PerformanceBase { |
| private static final int SIZE = 100; |
| private static final String[] COLUMNS = {"t1.a"}; |
| |
| @Override |
| public void setUp(Context c) { |
| super.setUp(c); |
| Random random = new Random(42); |
| |
| mDatabase |
| .execSQL("CREATE TABLE t1(a INTEGER, b INTEGER, c VARCHAR(100))"); |
| mDatabase |
| .execSQL("CREATE TABLE t2(a INTEGER, b INTEGER, c VARCHAR(100))"); |
| |
| for (int i = 0; i < SIZE; i++) { |
| int r = random.nextInt(100000); |
| mDatabase.execSQL("INSERT INTO t1 VALUES(" + i + "," + r + ",'" |
| + numberName(r) + "')"); |
| } |
| |
| for (int i = 0; i < SIZE; i++) { |
| int r = random.nextInt(100000); |
| mDatabase.execSQL("INSERT INTO t2 VALUES(" + i + "," + r + ",'" |
| + numberName(r) + "')"); |
| } |
| } |
| |
| @Override |
| public void run() { |
| mDatabase.query("t1 INNER JOIN t2 ON t1.b = t2.b", COLUMNS, null, |
| null, null, null, null); |
| } |
| } |
| |
| /** |
| * INNER JOIN without an index on one side |
| */ |
| |
| public static class Perf7Test extends PerformanceBase { |
| private static final int SIZE = 100; |
| private static final String[] COLUMNS = {"t1.a"}; |
| |
| @Override |
| public void setUp(Context c) { |
| super.setUp(c); |
| Random random = new Random(42); |
| |
| mDatabase |
| .execSQL("CREATE TABLE t1(a INTEGER, b INTEGER, c VARCHAR(100))"); |
| mDatabase |
| .execSQL("CREATE TABLE t2(a INTEGER, b INTEGER, c VARCHAR(100))"); |
| |
| mDatabase.execSQL("CREATE INDEX i1b ON t1(b)"); |
| |
| for (int i = 0; i < SIZE; i++) { |
| int r = random.nextInt(100000); |
| mDatabase.execSQL("INSERT INTO t1 VALUES(" + i + "," + r + ",'" |
| + numberName(r) + "')"); |
| } |
| |
| for (int i = 0; i < SIZE; i++) { |
| int r = random.nextInt(100000); |
| mDatabase.execSQL("INSERT INTO t2 VALUES(" + i + "," + r + ",'" |
| + numberName(r) + "')"); |
| } |
| } |
| |
| @Override |
| public void run() { |
| mDatabase.query("t1 INNER JOIN t2 ON t1.b = t2.b", COLUMNS, null, |
| null, null, null, null); |
| } |
| } |
| |
| /** |
| * INNER JOIN without an index on one side |
| */ |
| |
| public static class Perf8Test extends PerformanceBase { |
| private static final int SIZE = 100; |
| private static final String[] COLUMNS = {"t1.a"}; |
| |
| @Override |
| public void setUp(Context c) { |
| super.setUp(c); |
| Random random = new Random(42); |
| |
| mDatabase |
| .execSQL("CREATE TABLE t1(a INTEGER, b INTEGER, c VARCHAR(100))"); |
| mDatabase |
| .execSQL("CREATE TABLE t2(a INTEGER, b INTEGER, c VARCHAR(100))"); |
| |
| mDatabase.execSQL("CREATE INDEX i1b ON t1(b)"); |
| |
| for (int i = 0; i < SIZE; i++) { |
| int r = random.nextInt(100000); |
| mDatabase.execSQL("INSERT INTO t1 VALUES(" + i + "," + r + ",'" |
| + numberName(r) + "')"); |
| } |
| |
| for (int i = 0; i < SIZE; i++) { |
| int r = random.nextInt(100000); |
| mDatabase.execSQL("INSERT INTO t2 VALUES(" + i + "," + r + ",'" |
| + numberName(r) + "')"); |
| } |
| } |
| |
| @Override |
| public void run() { |
| mDatabase.query("t1 INNER JOIN t2 ON t1.c = t2.c", COLUMNS, null, |
| null, null, null, null); |
| } |
| } |
| |
| /** |
| * 100 SELECTs with subqueries. Subquery is using an index |
| */ |
| |
| public static class Perf9Test extends PerformanceBase { |
| private static final int SIZE = 100; |
| private static final String[] COLUMNS = {"t1.a"}; |
| |
| private String[] where = new String[SIZE]; |
| |
| @Override |
| public void setUp(Context c) { |
| super.setUp(c); |
| Random random = new Random(42); |
| |
| mDatabase |
| .execSQL("CREATE TABLE t1(a INTEGER, b INTEGER, c VARCHAR(100))"); |
| mDatabase |
| .execSQL("CREATE TABLE t2(a INTEGER, b INTEGER, c VARCHAR(100))"); |
| |
| mDatabase.execSQL("CREATE INDEX i2b ON t2(b)"); |
| |
| for (int i = 0; i < SIZE; i++) { |
| int r = random.nextInt(100000); |
| mDatabase.execSQL("INSERT INTO t1 VALUES(" + i + "," + r + ",'" |
| + numberName(r) + "')"); |
| } |
| |
| for (int i = 0; i < SIZE; i++) { |
| int r = random.nextInt(100000); |
| mDatabase.execSQL("INSERT INTO t2 VALUES(" + i + "," + r + ",'" |
| + numberName(r) + "')"); |
| } |
| |
| for (int i = 0; i < SIZE; i++) { |
| int lower = i * 100; |
| int upper = (i + 10) * 100; |
| where[i] = |
| "t1.b IN (SELECT t2.b FROM t2 WHERE t2.b >= " + lower |
| + " AND t2.b < " + upper + ")"; |
| } |
| } |
| |
| @Override |
| public void run() { |
| for (int i = 0; i < SIZE; i++) { |
| mDatabase |
| .query("t1", COLUMNS, where[i], null, null, null, null); |
| } |
| } |
| } |
| |
| /** |
| * 100 SELECTs on string comparison with Index |
| */ |
| |
| public static class Perf10Test extends PerformanceBase { |
| private static final int SIZE = 100; |
| private static final String[] COLUMNS = {"count(*)", "avg(b)"}; |
| |
| private String[] where = new String[SIZE]; |
| |
| @Override |
| public void setUp(Context c) { |
| super.setUp(c); |
| Random random = new Random(42); |
| |
| mDatabase |
| .execSQL("CREATE TABLE t1(a INTEGER, b INTEGER, c VARCHAR(100))"); |
| mDatabase.execSQL("CREATE INDEX i3c ON t1(c)"); |
| |
| for (int i = 0; i < SIZE; i++) { |
| int r = random.nextInt(100000); |
| mDatabase.execSQL("INSERT INTO t1 VALUES(" + i + "," + r + ",'" |
| + numberName(r) + "')"); |
| } |
| |
| for (int i = 0; i < SIZE; i++) { |
| where[i] = "c LIKE '" + numberName(i) + "'"; |
| } |
| } |
| |
| @Override |
| public void run() { |
| for (int i = 0; i < SIZE; i++) { |
| mDatabase |
| .query("t1", COLUMNS, where[i], null, null, null, null); |
| } |
| } |
| } |
| |
| /** |
| * 100 SELECTs on integer |
| */ |
| |
| public static class Perf11Test extends PerformanceBase { |
| private static final int SIZE = 100; |
| private static final String[] COLUMNS = {"b"}; |
| |
| private String[] where = new String[SIZE]; |
| |
| @Override |
| public void setUp(Context c) { |
| super.setUp(c); |
| Random random = new Random(42); |
| |
| mDatabase |
| .execSQL("CREATE TABLE t1(a INTEGER, b INTEGER, c VARCHAR(100))"); |
| |
| for (int i = 0; i < SIZE; i++) { |
| int r = random.nextInt(100000); |
| mDatabase.execSQL("INSERT INTO t1 VALUES(" + i + "," + r + ",'" |
| + numberName(r) + "')"); |
| } |
| |
| } |
| |
| @Override |
| public void run() { |
| for (int i = 0; i < SIZE; i++) { |
| mDatabase.query("t1", COLUMNS, null, null, null, null, null); |
| } |
| } |
| } |
| |
| /** |
| * 100 SELECTs on String |
| */ |
| |
| public static class Perf12Test extends PerformanceBase { |
| private static final int SIZE = 100; |
| private static final String[] COLUMNS = {"c"}; |
| |
| private String[] where = new String[SIZE]; |
| |
| @Override |
| public void setUp(Context c) { |
| super.setUp(c); |
| Random random = new Random(42); |
| |
| mDatabase |
| .execSQL("CREATE TABLE t1(a INTEGER, b INTEGER, c VARCHAR(100))"); |
| |
| for (int i = 0; i < SIZE; i++) { |
| int r = random.nextInt(100000); |
| mDatabase.execSQL("INSERT INTO t1 VALUES(" + i + "," + r + ",'" |
| + numberName(r) + "')"); |
| } |
| |
| } |
| |
| @Override |
| public void run() { |
| for (int i = 0; i < SIZE; i++) { |
| mDatabase.query("t1", COLUMNS, null, null, null, null, null); |
| } |
| } |
| } |
| |
| /** |
| * 100 SELECTs on integer with index |
| */ |
| |
| public static class Perf13Test extends PerformanceBase { |
| private static final int SIZE = 100; |
| private static final String[] COLUMNS = {"b"}; |
| |
| @Override |
| public void setUp(Context c) { |
| super.setUp(c); |
| Random random = new Random(42); |
| |
| mDatabase |
| .execSQL("CREATE TABLE t1(a INTEGER, b INTEGER, c VARCHAR(100))"); |
| mDatabase.execSQL("CREATE INDEX i1b on t1(b)"); |
| |
| for (int i = 0; i < SIZE; i++) { |
| int r = random.nextInt(100000); |
| mDatabase.execSQL("INSERT INTO t1 VALUES(" + i + "," + r + ",'" |
| + numberName(r) + "')"); |
| } |
| |
| } |
| |
| @Override |
| public void run() { |
| for (int i = 0; i < SIZE; i++) { |
| mDatabase.query("t1", COLUMNS, null, null, null, null, null); |
| } |
| } |
| } |
| |
| /** |
| * 100 SELECTs on String with index |
| */ |
| |
| public static class Perf14Test extends PerformanceBase { |
| private static final int SIZE = 100; |
| private static final String[] COLUMNS = {"c"}; |
| |
| @Override |
| public void setUp(Context c) { |
| super.setUp(c); |
| Random random = new Random(42); |
| |
| mDatabase |
| .execSQL("CREATE TABLE t1(a INTEGER, b INTEGER, c VARCHAR(100))"); |
| mDatabase.execSQL("CREATE INDEX i1c ON t1(c)"); |
| |
| for (int i = 0; i < SIZE; i++) { |
| int r = random.nextInt(100000); |
| mDatabase.execSQL("INSERT INTO t1 VALUES(" + i + "," + r + ",'" |
| + numberName(r) + "')"); |
| } |
| |
| } |
| |
| @Override |
| public void run() { |
| for (int i = 0; i < SIZE; i++) { |
| mDatabase.query("t1", COLUMNS, null, null, null, null, null); |
| } |
| } |
| } |
| |
| /** |
| * 100 SELECTs on String with starts with |
| */ |
| |
| public static class Perf15Test extends PerformanceBase { |
| private static final int SIZE = 100; |
| private static final String[] COLUMNS = {"c"}; |
| private String[] where = new String[SIZE]; |
| |
| @Override |
| public void setUp(Context c) { |
| super.setUp(c); |
| Random random = new Random(42); |
| |
| mDatabase |
| .execSQL("CREATE TABLE t1(a INTEGER, b INTEGER, c VARCHAR(100))"); |
| mDatabase.execSQL("CREATE INDEX i1c ON t1(c)"); |
| |
| for (int i = 0; i < SIZE; i++) { |
| int r = random.nextInt(100000); |
| mDatabase.execSQL("INSERT INTO t1 VALUES(" + i + "," + r + ",'" |
| + numberName(r) + "')"); |
| } |
| |
| for (int i = 0; i < SIZE; i++) { |
| int r = random.nextInt(100000); |
| where[i] = "c LIKE '" + numberName(r).substring(0, 1) + "*'"; |
| |
| } |
| |
| } |
| |
| @Override |
| public void run() { |
| for (int i = 0; i < SIZE; i++) { |
| mDatabase |
| .query("t1", COLUMNS, where[i], null, null, null, null); |
| } |
| } |
| } |
| |
| /** |
| * 1000 Deletes on an indexed table |
| */ |
| |
| public static class Perf16Test extends PerformanceBase { |
| private static final int SIZE = 1000; |
| private static final String[] COLUMNS = {"c"}; |
| |
| @Override |
| public void setUp(Context c) { |
| super.setUp(c); |
| Random random = new Random(42); |
| |
| mDatabase |
| .execSQL("CREATE TABLE t1(a INTEGER, b INTEGER, c VARCHAR(100))"); |
| mDatabase.execSQL("CREATE INDEX i3c ON t1(c)"); |
| |
| for (int i = 0; i < SIZE; i++) { |
| int r = random.nextInt(100000); |
| mDatabase.execSQL("INSERT INTO t1 VALUES(" + i + "," + r + ",'" |
| + numberName(r) + "')"); |
| } |
| |
| } |
| |
| @Override |
| public void run() { |
| for (int i = 0; i < SIZE; i++) { |
| mDatabase.delete("t1", null, null); |
| } |
| } |
| } |
| |
| /** |
| * 1000 Deletes |
| */ |
| |
| public static class Perf17Test extends PerformanceBase { |
| private static final int SIZE = 1000; |
| private static final String[] COLUMNS = {"c"}; |
| |
| @Override |
| public void setUp(Context c) { |
| super.setUp(c); |
| Random random = new Random(42); |
| |
| mDatabase |
| .execSQL("CREATE TABLE t1(a INTEGER, b INTEGER, c VARCHAR(100))"); |
| |
| for (int i = 0; i < SIZE; i++) { |
| int r = random.nextInt(100000); |
| mDatabase.execSQL("INSERT INTO t1 VALUES(" + i + "," + r + ",'" |
| + numberName(r) + "')"); |
| } |
| |
| } |
| |
| @Override |
| public void run() { |
| for (int i = 0; i < SIZE; i++) { |
| mDatabase.delete("t1", null, null); |
| } |
| } |
| } |
| |
| /** |
| * 1000 DELETE's without an index with where clause |
| */ |
| |
| public static class Perf18Test extends PerformanceBase { |
| private static final int SIZE = 1000; |
| private String[] where = new String[SIZE]; |
| |
| @Override |
| public void setUp(Context c) { |
| super.setUp(c); |
| Random random = new Random(42); |
| |
| mDatabase |
| .execSQL("CREATE TABLE t1(a INTEGER, b INTEGER, c VARCHAR(100))"); |
| |
| for (int i = 0; i < SIZE; i++) { |
| int r = random.nextInt(100000); |
| mDatabase.execSQL("INSERT INTO t1 VALUES(" + i + "," + r + ",'" |
| + numberName(r) + "')"); |
| } |
| |
| for (int i = 0; i < SIZE; i++) { |
| int lower = i * 100; |
| int upper = (i + 10) * 100; |
| where[i] = "b >= " + lower + " AND b < " + upper; |
| } |
| } |
| |
| @Override |
| public void run() { |
| for (int i = 0; i < SIZE; i++) { |
| mDatabase.delete("t1", where[i], null); |
| } |
| } |
| } |
| |
| /** |
| * 1000 DELETE's with an index with where clause |
| */ |
| |
| public static class Perf19Test extends PerformanceBase { |
| private static final int SIZE = 1000; |
| private String[] where = new String[SIZE]; |
| |
| @Override |
| public void setUp(Context c) { |
| super.setUp(c); |
| Random random = new Random(42); |
| |
| mDatabase |
| .execSQL("CREATE TABLE t1(a INTEGER, b INTEGER, c VARCHAR(100))"); |
| mDatabase.execSQL("CREATE INDEX i1b ON t1(b)"); |
| |
| for (int i = 0; i < SIZE; i++) { |
| int r = random.nextInt(100000); |
| mDatabase.execSQL("INSERT INTO t1 VALUES(" + i + "," + r + ",'" |
| + numberName(r) + "')"); |
| } |
| |
| for (int i = 0; i < SIZE; i++) { |
| int lower = i * 100; |
| int upper = (i + 10) * 100; |
| where[i] = "b >= " + lower + " AND b < " + upper; |
| } |
| } |
| |
| @Override |
| public void run() { |
| for (int i = 0; i < SIZE; i++) { |
| mDatabase.delete("t1", where[i], null); |
| } |
| } |
| } |
| |
| /** |
| * 1000 update's with an index with where clause |
| */ |
| |
| public static class Perf20Test extends PerformanceBase { |
| private static final int SIZE = 1000; |
| private String[] where = new String[SIZE]; |
| ContentValues[] mValues = new ContentValues[SIZE]; |
| |
| @Override |
| public void setUp(Context c) { |
| super.setUp(c); |
| Random random = new Random(42); |
| |
| mDatabase |
| .execSQL("CREATE TABLE t1(a INTEGER, b INTEGER, c VARCHAR(100))"); |
| mDatabase.execSQL("CREATE INDEX i1b ON t1(b)"); |
| |
| for (int i = 0; i < SIZE; i++) { |
| int r = random.nextInt(100000); |
| mDatabase.execSQL("INSERT INTO t1 VALUES(" + i + "," + r + ",'" |
| + numberName(r) + "')"); |
| } |
| |
| for (int i = 0; i < SIZE; i++) { |
| |
| int lower = i * 100; |
| int upper = (i + 10) * 100; |
| where[i] = "b >= " + lower + " AND b < " + upper; |
| ContentValues b = new ContentValues(1); |
| b.put("b", upper); |
| mValues[i] = b; |
| |
| } |
| } |
| |
| @Override |
| public void run() { |
| for (int i = 0; i < SIZE; i++) { |
| mDatabase.update("t1", mValues[i], where[i], null); |
| } |
| } |
| } |
| |
| /** |
| * 1000 update's without an index with where clause |
| */ |
| |
| public static class Perf21Test extends PerformanceBase { |
| private static final int SIZE = 1000; |
| private String[] where = new String[SIZE]; |
| ContentValues[] mValues = new ContentValues[SIZE]; |
| |
| @Override |
| public void setUp(Context c) { |
| super.setUp(c); |
| Random random = new Random(42); |
| |
| mDatabase |
| .execSQL("CREATE TABLE t1(a INTEGER, b INTEGER, c VARCHAR(100))"); |
| |
| for (int i = 0; i < SIZE; i++) { |
| int r = random.nextInt(100000); |
| mDatabase.execSQL("INSERT INTO t1 VALUES(" + i + "," + r + ",'" |
| + numberName(r) + "')"); |
| } |
| |
| for (int i = 0; i < SIZE; i++) { |
| |
| int lower = i * 100; |
| int upper = (i + 10) * 100; |
| where[i] = "b >= " + lower + " AND b < " + upper; |
| ContentValues b = new ContentValues(1); |
| b.put("b", upper); |
| mValues[i] = b; |
| } |
| } |
| |
| @Override |
| public void run() { |
| for (int i = 0; i < SIZE; i++) { |
| mDatabase.update("t1", mValues[i], where[i], null); |
| } |
| } |
| } |
| |
| /** |
| * 10000 inserts for an integer |
| */ |
| |
| public static class Perf22Test extends PerformanceBase { |
| private static final int SIZE = 10000; |
| ContentValues[] mValues = new ContentValues[SIZE]; |
| |
| @Override |
| public void setUp(Context c) { |
| super.setUp(c); |
| Random random = new Random(42); |
| |
| mDatabase |
| .execSQL("CREATE TABLE t1(a INTEGER)"); |
| |
| for (int i = 0; i < SIZE; i++) { |
| int r = random.nextInt(100000); |
| ContentValues b = new ContentValues(1); |
| b.put("a", r); |
| mValues[i] = b; |
| } |
| } |
| |
| @Override |
| public void run() { |
| for (int i = 0; i < SIZE; i++) { |
| mDatabase.insert("t1", null, mValues[i]); |
| } |
| } |
| } |
| |
| /** |
| * 10000 inserts for an integer -indexed table |
| */ |
| |
| public static class Perf23Test extends PerformanceBase { |
| private static final int SIZE = 10000; |
| ContentValues[] mValues = new ContentValues[SIZE]; |
| |
| @Override |
| public void setUp(Context c) { |
| super.setUp(c); |
| Random random = new Random(42); |
| |
| mDatabase |
| .execSQL("CREATE TABLE t1(a INTEGER)"); |
| mDatabase.execSQL("CREATE INDEX i1a ON t1(a)"); |
| |
| for (int i = 0; i < SIZE; i++) { |
| int r = random.nextInt(100000); |
| ContentValues b = new ContentValues(1); |
| b.put("a", r); |
| mValues[i] = b; |
| } |
| } |
| |
| @Override |
| public void run() { |
| for (int i = 0; i < SIZE; i++) { |
| mDatabase.insert("t1", null, mValues[i]); |
| } |
| } |
| } |
| |
| /** |
| * 10000 inserts for a String |
| */ |
| |
| public static class Perf24Test extends PerformanceBase { |
| private static final int SIZE = 10000; |
| ContentValues[] mValues = new ContentValues[SIZE]; |
| |
| @Override |
| public void setUp(Context c) { |
| super.setUp(c); |
| Random random = new Random(42); |
| |
| mDatabase |
| .execSQL("CREATE TABLE t1(a VARCHAR(100))"); |
| |
| for (int i = 0; i < SIZE; i++) { |
| int r = random.nextInt(100000); |
| ContentValues b = new ContentValues(1); |
| b.put("a", numberName(r)); |
| mValues[i] = b; |
| } |
| } |
| |
| @Override |
| public void run() { |
| for (int i = 0; i < SIZE; i++) { |
| mDatabase.insert("t1", null, mValues[i]); |
| } |
| } |
| } |
| |
| /** |
| * 10000 inserts for a String - indexed table |
| */ |
| |
| public static class Perf25Test extends PerformanceBase { |
| private static final int SIZE = 10000; |
| ContentValues[] mValues = new ContentValues[SIZE]; |
| |
| @Override |
| public void setUp(Context c) { |
| super.setUp(c); |
| Random random = new Random(42); |
| |
| mDatabase |
| .execSQL("CREATE TABLE t1(a VARCHAR(100))"); |
| mDatabase.execSQL("CREATE INDEX i1a ON t1(a)"); |
| |
| for (int i = 0; i < SIZE; i++) { |
| int r = random.nextInt(100000); |
| ContentValues b = new ContentValues(1); |
| b.put("a", numberName(r)); |
| mValues[i] = b; |
| } |
| } |
| |
| @Override |
| public void run() { |
| for (int i = 0; i < SIZE; i++) { |
| mDatabase.insert("t1", null, mValues[i]); |
| } |
| } |
| } |
| |
| |
| /** |
| * 10000 selects for a String -starts with |
| */ |
| |
| public static class Perf26Test extends PerformanceBase { |
| private static final int SIZE = 10000; |
| private static final String[] COLUMNS = {"t3.a"}; |
| private String[] where = new String[SIZE]; |
| |
| @Override |
| public void setUp(Context c) { |
| super.setUp(c); |
| Random random = new Random(42); |
| |
| mDatabase |
| .execSQL("CREATE TABLE t3(a VARCHAR(100))"); |
| |
| for (int i = 0; i < SIZE; i++) { |
| int r = random.nextInt(100000); |
| mDatabase.execSQL("INSERT INTO t3 VALUES('" |
| + numberName(r) + "')"); |
| } |
| |
| for (int i = 0; i < SIZE; i++) { |
| int r = random.nextInt(100000); |
| where[i] = "a LIKE '" + numberName(r).substring(0, 1) + "*'"; |
| |
| } |
| } |
| |
| @Override |
| public void run() { |
| for (int i = 0; i < SIZE; i++) { |
| mDatabase.query("t3", COLUMNS, where[i], null, null, null, null); |
| } |
| } |
| } |
| |
| /** |
| * 10000 selects for a String - indexed table -starts with |
| */ |
| |
| public static class Perf27Test extends PerformanceBase { |
| private static final int SIZE = 10000; |
| private static final String[] COLUMNS = {"t3.a"}; |
| private String[] where = new String[SIZE]; |
| |
| @Override |
| public void setUp(Context c) { |
| super.setUp(c); |
| Random random = new Random(42); |
| |
| mDatabase |
| .execSQL("CREATE TABLE t3(a VARCHAR(100))"); |
| mDatabase.execSQL("CREATE INDEX i3a ON t3(a)"); |
| |
| for (int i = 0; i < SIZE; i++) { |
| int r = random.nextInt(100000); |
| mDatabase.execSQL("INSERT INTO t3 VALUES('" |
| + numberName(r) + "')"); |
| } |
| |
| for (int i = 0; i < SIZE; i++) { |
| int r = random.nextInt(100000); |
| where[i] = "a LIKE '" + numberName(r).substring(0, 1) + "*'"; |
| |
| } |
| } |
| |
| @Override |
| public void run() { |
| for (int i = 0; i < SIZE; i++) { |
| mDatabase.query("t3", COLUMNS, where[i], null, null, null, null); |
| } |
| } |
| } |
| |
| /** |
| * 10000 selects for an integer - |
| */ |
| |
| public static class Perf28Test extends PerformanceBase { |
| private static final int SIZE = 10000; |
| private static final String[] COLUMNS = {"t4.a"}; |
| private String[] where = new String[SIZE]; |
| |
| @Override |
| public void setUp(Context c) { |
| super.setUp(c); |
| Random random = new Random(42); |
| |
| mDatabase |
| .execSQL("CREATE TABLE t4(a INTEGER)"); |
| |
| for (int i = 0; i < SIZE; i++) { |
| int r = random.nextInt(100000); |
| mDatabase.execSQL("INSERT INTO t4 VALUES(" + r + ")"); |
| int lower = i * 100; |
| int upper = (i + 10) * 100; |
| where[i] = "a >= " + lower + " AND a < " + upper; |
| } |
| } |
| |
| @Override |
| public void run() { |
| for (int i = 0; i < SIZE; i++) { |
| mDatabase.query("t4", COLUMNS, where[i], null, null, null, null); |
| } |
| } |
| } |
| |
| /** |
| * 10000 selects for an integer -indexed table |
| */ |
| |
| public static class Perf29Test extends PerformanceBase { |
| private static final int SIZE = 10000; |
| private static final String[] COLUMNS = {"t4.a"}; |
| private String[] where = new String[SIZE]; |
| |
| @Override |
| public void setUp(Context c) { |
| super.setUp(c); |
| Random random = new Random(42); |
| |
| mDatabase |
| .execSQL("CREATE TABLE t4(a INTEGER)"); |
| mDatabase.execSQL("CREATE INDEX i4a ON t4(a)"); |
| |
| for (int i = 0; i < SIZE; i++) { |
| int r = random.nextInt(100000); |
| mDatabase.execSQL("INSERT INTO t4 VALUES(" + r + ")"); |
| |
| int lower = i * 100; |
| int upper = (i + 10) * 100; |
| where[i] = "a >= " + lower + " AND a < " + upper; |
| } |
| |
| } |
| |
| @Override |
| public void run() { |
| for (int i = 0; i < SIZE; i++) { |
| mDatabase.query("t4", COLUMNS, where[i], null, null, null, null); |
| } |
| } |
| } |
| |
| |
| /** |
| * 10000 selects for a String - contains 'e' |
| */ |
| |
| public static class Perf30Test extends PerformanceBase { |
| private static final int SIZE = 10000; |
| private static final String[] COLUMNS = {"t3.a"}; |
| private String[] where = new String[SIZE]; |
| |
| @Override |
| public void setUp(Context c) { |
| super.setUp(c); |
| Random random = new Random(42); |
| |
| mDatabase |
| .execSQL("CREATE TABLE t3(a VARCHAR(100))"); |
| |
| for (int i = 0; i < SIZE; i++) { |
| int r = random.nextInt(100000); |
| mDatabase.execSQL("INSERT INTO t3 VALUES('" |
| + numberName(r) + "')"); |
| } |
| |
| for (int i = 0; i < SIZE; i++) { |
| where[i] = "a LIKE '*e*'"; |
| |
| } |
| } |
| |
| @Override |
| public void run() { |
| for (int i = 0; i < SIZE; i++) { |
| mDatabase.query("t3", COLUMNS, where[i], null, null, null, null); |
| } |
| } |
| } |
| |
| /** |
| * 10000 selects for a String - contains 'e'-indexed table |
| */ |
| |
| public static class Perf31Test extends PerformanceBase { |
| private static final int SIZE = 10000; |
| private static final String[] COLUMNS = {"t3.a"}; |
| private String[] where = new String[SIZE]; |
| |
| @Override |
| public void setUp(Context c) { |
| super.setUp(c); |
| Random random = new Random(42); |
| |
| mDatabase |
| .execSQL("CREATE TABLE t3(a VARCHAR(100))"); |
| mDatabase.execSQL("CREATE INDEX i3a ON t3(a)"); |
| |
| for (int i = 0; i < SIZE; i++) { |
| int r = random.nextInt(100000); |
| mDatabase.execSQL("INSERT INTO t3 VALUES('" |
| + numberName(r) + "')"); |
| } |
| |
| for (int i = 0; i < SIZE; i++) { |
| where[i] = "a LIKE '*e*'"; |
| |
| } |
| |
| } |
| |
| @Override |
| public void run() { |
| for (int i = 0; i < SIZE; i++) { |
| mDatabase.query("t3", COLUMNS, where[i], null, null, null, null); |
| } |
| } |
| } |
| |
| public static final String[] ONES = |
| {"zero", "one", "two", "three", "four", "five", "six", "seven", |
| "eight", "nine", "ten", "eleven", "twelve", "thirteen", |
| "fourteen", "fifteen", "sixteen", "seventeen", "eighteen", |
| "nineteen"}; |
| |
| public static final String[] TENS = |
| {"", "ten", "twenty", "thirty", "forty", "fifty", "sixty", |
| "seventy", "eighty", "ninety"}; |
| } |