1 /* 2 * Copyright (C) 2007 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 package android.database; 18 19 import junit.framework.Assert; 20 21 import android.content.ContentValues; 22 import android.content.Context; 23 import android.database.Cursor; 24 import android.database.sqlite.SQLiteDatabase; 25 import android.provider.Contacts; 26 import android.provider.Contacts.People; 27 import android.test.PerformanceTestCase; 28 import android.test.TestCase; 29 30 import java.io.File; 31 import java.util.Random; 32 33 /** 34 * Database Performance Tests 35 * 36 */ 37 38 @SuppressWarnings("deprecation") 39 public class DatabasePerformanceTests { 40 41 public static String[] children() { 42 return new String[] { 43 ContactReadingTest1.class.getName(), 44 Perf1Test.class.getName(), 45 Perf2Test.class.getName(), 46 Perf3Test.class.getName(), 47 Perf4Test.class.getName(), 48 Perf5Test.class.getName(), 49 Perf6Test.class.getName(), 50 Perf7Test.class.getName(), 51 Perf8Test.class.getName(), 52 Perf9Test.class.getName(), 53 Perf10Test.class.getName(), 54 Perf11Test.class.getName(), 55 Perf12Test.class.getName(), 56 Perf13Test.class.getName(), 57 Perf14Test.class.getName(), 58 Perf15Test.class.getName(), 59 Perf16Test.class.getName(), 60 Perf17Test.class.getName(), 61 Perf18Test.class.getName(), 62 Perf19Test.class.getName(), 63 Perf20Test.class.getName(), 64 Perf21Test.class.getName(), 65 Perf22Test.class.getName(), 66 Perf23Test.class.getName(), 67 Perf24Test.class.getName(), 68 Perf25Test.class.getName(), 69 Perf26Test.class.getName(), 70 Perf27Test.class.getName(), 71 Perf28Test.class.getName(), 72 Perf29Test.class.getName(), 73 Perf30Test.class.getName(), 74 Perf31Test.class.getName(), 75 }; 76 } 77 78 public static abstract class PerformanceBase implements TestCase, 79 PerformanceTestCase { 80 protected static final int CURRENT_DATABASE_VERSION = 42; 81 protected SQLiteDatabase mDatabase; 82 protected File mDatabaseFile; 83 protected Context mContext; 84 85 public void setUp(Context c) { 86 mContext = c; 87 mDatabaseFile = new File("/tmp", "perf_database_test.db"); 88 if (mDatabaseFile.exists()) { 89 mDatabaseFile.delete(); 90 } 91 mDatabase = SQLiteDatabase.openOrCreateDatabase(mDatabaseFile.getPath(), null); 92 Assert.assertTrue(mDatabase != null); 93 mDatabase.setVersion(CURRENT_DATABASE_VERSION); 94 } 95 96 public void tearDown() { 97 mDatabase.close(); 98 mDatabaseFile.delete(); 99 } 100 101 public boolean isPerformanceOnly() { 102 return true; 103 } 104 105 // These test can only be run once. 106 public int startPerformance(Intermediates intermediates) { 107 return 0; 108 } 109 110 public void run() { 111 } 112 113 public String numberName(int number) { 114 String result = ""; 115 116 if (number >= 1000) { 117 result += numberName((number / 1000)) + " thousand"; 118 number = (number % 1000); 119 120 if (number > 0) result += " "; 121 } 122 123 if (number >= 100) { 124 result += ONES[(number / 100)] + " hundred"; 125 number = (number % 100); 126 127 if (number > 0) result += " "; 128 } 129 130 if (number >= 20) { 131 result += TENS[(number / 10)]; 132 number = (number % 10); 133 134 if (number > 0) result += " "; 135 } 136 137 if (number > 0) { 138 result += ONES[number]; 139 } 140 141 return result; 142 } 143 } 144 145 /** 146 * Test reading all contact data. 147 */ 148 public static class ContactReadingTest1 implements TestCase, PerformanceTestCase { 149 private static final String[] PEOPLE_PROJECTION = new String[] { 150 Contacts.People._ID, // 0 151 Contacts.People.PRIMARY_PHONE_ID, // 1 152 Contacts.People.TYPE, // 2 153 Contacts.People.NUMBER, // 3 154 Contacts.People.LABEL, // 4 155 Contacts.People.NAME, // 5 156 Contacts.People.PRESENCE_STATUS, // 6 157 }; 158 159 private Cursor mCursor; 160 161 public void setUp(Context c) { 162 mCursor = c.getContentResolver().query(People.CONTENT_URI, PEOPLE_PROJECTION, null, 163 null, People.DEFAULT_SORT_ORDER); 164 } 165 166 public void tearDown() { 167 mCursor.close(); 168 } 169 170 public boolean isPerformanceOnly() { 171 return true; 172 } 173 174 public int startPerformance(Intermediates intermediates) { 175 // This test can only be run once. 176 return 0; 177 } 178 179 public void run() { 180 while (mCursor.moveToNext()) { 181 // Read out all of the data 182 mCursor.getLong(0); 183 mCursor.getLong(1); 184 mCursor.getLong(2); 185 mCursor.getString(3); 186 mCursor.getString(4); 187 mCursor.getString(5); 188 mCursor.getLong(6); 189 } 190 } 191 } 192 193 /** 194 * Test 1000 inserts 195 */ 196 197 public static class Perf1Test extends PerformanceBase { 198 private static final int SIZE = 1000; 199 200 private String[] statements = new String[SIZE]; 201 202 @Override 203 public void setUp(Context c) { 204 super.setUp(c); 205 Random random = new Random(42); 206 207 for (int i = 0; i < SIZE; i++) { 208 int r = random.nextInt(100000); 209 statements[i] = 210 "INSERT INTO t1 VALUES(" + i + "," + r + ",'" 211 + numberName(r) + "')"; 212 } 213 214 mDatabase 215 .execSQL("CREATE TABLE t1(a INTEGER, b INTEGER, c VARCHAR(100))"); 216 } 217 218 @Override 219 public void run() { 220 for (int i = 0; i < SIZE; i++) { 221 mDatabase.execSQL(statements[i]); 222 } 223 } 224 } 225 226 /** 227 * Test 1000 inserts into and indexed table 228 */ 229 230 public static class Perf2Test extends PerformanceBase { 231 private static final int SIZE = 1000; 232 233 private String[] statements = new String[SIZE]; 234 235 @Override 236 public void setUp(Context c) { 237 super.setUp(c); 238 Random random = new Random(42); 239 240 for (int i = 0; i < SIZE; i++) { 241 int r = random.nextInt(100000); 242 statements[i] = 243 "INSERT INTO t1 VALUES(" + i + "," + r + ",'" 244 + numberName(r) + "')"; 245 } 246 247 mDatabase 248 .execSQL("CREATE TABLE t1(a INTEGER, b INTEGER, c VARCHAR(100))"); 249 mDatabase.execSQL("CREATE INDEX i1c ON t1(c)"); 250 } 251 252 @Override 253 public void run() { 254 for (int i = 0; i < SIZE; i++) { 255 mDatabase.execSQL(statements[i]); 256 } 257 } 258 } 259 260 /** 261 * 100 SELECTs without an index 262 */ 263 264 public static class Perf3Test extends PerformanceBase { 265 private static final int SIZE = 100; 266 private static final String[] COLUMNS = {"count(*)", "avg(b)"}; 267 268 private String[] where = new String[SIZE]; 269 270 @Override 271 public void setUp(Context c) { 272 super.setUp(c); 273 Random random = new Random(42); 274 275 mDatabase 276 .execSQL("CREATE TABLE t1(a INTEGER, b INTEGER, c VARCHAR(100))"); 277 278 for (int i = 0; i < SIZE; i++) { 279 int r = random.nextInt(100000); 280 mDatabase.execSQL("INSERT INTO t1 VALUES(" + i + "," + r + ",'" 281 + numberName(r) + "')"); 282 } 283 284 for (int i = 0; i < SIZE; i++) { 285 int lower = i * 100; 286 int upper = (i + 10) * 100; 287 where[i] = "b >= " + lower + " AND b < " + upper; 288 } 289 } 290 291 @Override 292 public void run() { 293 for (int i = 0; i < SIZE; i++) { 294 mDatabase 295 .query("t1", COLUMNS, where[i], null, null, null, null); 296 } 297 } 298 } 299 300 /** 301 * 100 SELECTs on a string comparison 302 */ 303 304 public static class Perf4Test extends PerformanceBase { 305 private static final int SIZE = 100; 306 private static final String[] COLUMNS = {"count(*)", "avg(b)"}; 307 308 private String[] where = new String[SIZE]; 309 310 @Override 311 public void setUp(Context c) { 312 super.setUp(c); 313 Random random = new Random(42); 314 315 mDatabase 316 .execSQL("CREATE TABLE t1(a INTEGER, b INTEGER, c VARCHAR(100))"); 317 318 for (int i = 0; i < SIZE; i++) { 319 int r = random.nextInt(100000); 320 mDatabase.execSQL("INSERT INTO t1 VALUES(" + i + "," + r + ",'" 321 + numberName(r) + "')"); 322 } 323 324 for (int i = 0; i < SIZE; i++) { 325 where[i] = "c LIKE '" + numberName(i) + "'"; 326 } 327 } 328 329 @Override 330 public void run() { 331 for (int i = 0; i < SIZE; i++) { 332 mDatabase 333 .query("t1", COLUMNS, where[i], null, null, null, null); 334 } 335 } 336 } 337 338 /** 339 * 100 SELECTs with an index 340 */ 341 342 public static class Perf5Test extends PerformanceBase { 343 private static final int SIZE = 100; 344 private static final String[] COLUMNS = {"count(*)", "avg(b)"}; 345 346 private String[] where = new String[SIZE]; 347 348 @Override 349 public void setUp(Context c) { 350 super.setUp(c); 351 Random random = new Random(42); 352 353 mDatabase 354 .execSQL("CREATE TABLE t1(a INTEGER, b INTEGER, c VARCHAR(100))"); 355 mDatabase.execSQL("CREATE INDEX i1b ON t1(b)"); 356 357 for (int i = 0; i < SIZE; i++) { 358 int r = random.nextInt(100000); 359 mDatabase.execSQL("INSERT INTO t1 VALUES(" + i + "," + r + ",'" 360 + numberName(r) + "')"); 361 } 362 363 for (int i = 0; i < SIZE; i++) { 364 int lower = i * 100; 365 int upper = (i + 10) * 100; 366 where[i] = "b >= " + lower + " AND b < " + upper; 367 } 368 } 369 370 @Override 371 public void run() { 372 for (int i = 0; i < SIZE; i++) { 373 mDatabase 374 .query("t1", COLUMNS, where[i], null, null, null, null); 375 } 376 } 377 } 378 379 /** 380 * INNER JOIN without an index 381 */ 382 383 public static class Perf6Test extends PerformanceBase { 384 private static final int SIZE = 100; 385 private static final String[] COLUMNS = {"t1.a"}; 386 387 @Override 388 public void setUp(Context c) { 389 super.setUp(c); 390 Random random = new Random(42); 391 392 mDatabase 393 .execSQL("CREATE TABLE t1(a INTEGER, b INTEGER, c VARCHAR(100))"); 394 mDatabase 395 .execSQL("CREATE TABLE t2(a INTEGER, b INTEGER, c VARCHAR(100))"); 396 397 for (int i = 0; i < SIZE; i++) { 398 int r = random.nextInt(100000); 399 mDatabase.execSQL("INSERT INTO t1 VALUES(" + i + "," + r + ",'" 400 + numberName(r) + "')"); 401 } 402 403 for (int i = 0; i < SIZE; i++) { 404 int r = random.nextInt(100000); 405 mDatabase.execSQL("INSERT INTO t2 VALUES(" + i + "," + r + ",'" 406 + numberName(r) + "')"); 407 } 408 } 409 410 @Override 411 public void run() { 412 mDatabase.query("t1 INNER JOIN t2 ON t1.b = t2.b", COLUMNS, null, 413 null, null, null, null); 414 } 415 } 416 417 /** 418 * INNER JOIN without an index on one side 419 */ 420 421 public static class Perf7Test extends PerformanceBase { 422 private static final int SIZE = 100; 423 private static final String[] COLUMNS = {"t1.a"}; 424 425 @Override 426 public void setUp(Context c) { 427 super.setUp(c); 428 Random random = new Random(42); 429 430 mDatabase 431 .execSQL("CREATE TABLE t1(a INTEGER, b INTEGER, c VARCHAR(100))"); 432 mDatabase 433 .execSQL("CREATE TABLE t2(a INTEGER, b INTEGER, c VARCHAR(100))"); 434 435 mDatabase.execSQL("CREATE INDEX i1b ON t1(b)"); 436 437 for (int i = 0; i < SIZE; i++) { 438 int r = random.nextInt(100000); 439 mDatabase.execSQL("INSERT INTO t1 VALUES(" + i + "," + r + ",'" 440 + numberName(r) + "')"); 441 } 442 443 for (int i = 0; i < SIZE; i++) { 444 int r = random.nextInt(100000); 445 mDatabase.execSQL("INSERT INTO t2 VALUES(" + i + "," + r + ",'" 446 + numberName(r) + "')"); 447 } 448 } 449 450 @Override 451 public void run() { 452 mDatabase.query("t1 INNER JOIN t2 ON t1.b = t2.b", COLUMNS, null, 453 null, null, null, null); 454 } 455 } 456 457 /** 458 * INNER JOIN without an index on one side 459 */ 460 461 public static class Perf8Test extends PerformanceBase { 462 private static final int SIZE = 100; 463 private static final String[] COLUMNS = {"t1.a"}; 464 465 @Override 466 public void setUp(Context c) { 467 super.setUp(c); 468 Random random = new Random(42); 469 470 mDatabase 471 .execSQL("CREATE TABLE t1(a INTEGER, b INTEGER, c VARCHAR(100))"); 472 mDatabase 473 .execSQL("CREATE TABLE t2(a INTEGER, b INTEGER, c VARCHAR(100))"); 474 475 mDatabase.execSQL("CREATE INDEX i1b ON t1(b)"); 476 477 for (int i = 0; i < SIZE; i++) { 478 int r = random.nextInt(100000); 479 mDatabase.execSQL("INSERT INTO t1 VALUES(" + i + "," + r + ",'" 480 + numberName(r) + "')"); 481 } 482 483 for (int i = 0; i < SIZE; i++) { 484 int r = random.nextInt(100000); 485 mDatabase.execSQL("INSERT INTO t2 VALUES(" + i + "," + r + ",'" 486 + numberName(r) + "')"); 487 } 488 } 489 490 @Override 491 public void run() { 492 mDatabase.query("t1 INNER JOIN t2 ON t1.c = t2.c", COLUMNS, null, 493 null, null, null, null); 494 } 495 } 496 497 /** 498 * 100 SELECTs with subqueries. Subquery is using an index 499 */ 500 501 public static class Perf9Test extends PerformanceBase { 502 private static final int SIZE = 100; 503 private static final String[] COLUMNS = {"t1.a"}; 504 505 private String[] where = new String[SIZE]; 506 507 @Override 508 public void setUp(Context c) { 509 super.setUp(c); 510 Random random = new Random(42); 511 512 mDatabase 513 .execSQL("CREATE TABLE t1(a INTEGER, b INTEGER, c VARCHAR(100))"); 514 mDatabase 515 .execSQL("CREATE TABLE t2(a INTEGER, b INTEGER, c VARCHAR(100))"); 516 517 mDatabase.execSQL("CREATE INDEX i2b ON t2(b)"); 518 519 for (int i = 0; i < SIZE; i++) { 520 int r = random.nextInt(100000); 521 mDatabase.execSQL("INSERT INTO t1 VALUES(" + i + "," + r + ",'" 522 + numberName(r) + "')"); 523 } 524 525 for (int i = 0; i < SIZE; i++) { 526 int r = random.nextInt(100000); 527 mDatabase.execSQL("INSERT INTO t2 VALUES(" + i + "," + r + ",'" 528 + numberName(r) + "')"); 529 } 530 531 for (int i = 0; i < SIZE; i++) { 532 int lower = i * 100; 533 int upper = (i + 10) * 100; 534 where[i] = 535 "t1.b IN (SELECT t2.b FROM t2 WHERE t2.b >= " + lower 536 + " AND t2.b < " + upper + ")"; 537 } 538 } 539 540 @Override 541 public void run() { 542 for (int i = 0; i < SIZE; i++) { 543 mDatabase 544 .query("t1", COLUMNS, where[i], null, null, null, null); 545 } 546 } 547 } 548 549 /** 550 * 100 SELECTs on string comparison with Index 551 */ 552 553 public static class Perf10Test extends PerformanceBase { 554 private static final int SIZE = 100; 555 private static final String[] COLUMNS = {"count(*)", "avg(b)"}; 556 557 private String[] where = new String[SIZE]; 558 559 @Override 560 public void setUp(Context c) { 561 super.setUp(c); 562 Random random = new Random(42); 563 564 mDatabase 565 .execSQL("CREATE TABLE t1(a INTEGER, b INTEGER, c VARCHAR(100))"); 566 mDatabase.execSQL("CREATE INDEX i3c ON t1(c)"); 567 568 for (int i = 0; i < SIZE; i++) { 569 int r = random.nextInt(100000); 570 mDatabase.execSQL("INSERT INTO t1 VALUES(" + i + "," + r + ",'" 571 + numberName(r) + "')"); 572 } 573 574 for (int i = 0; i < SIZE; i++) { 575 where[i] = "c LIKE '" + numberName(i) + "'"; 576 } 577 } 578 579 @Override 580 public void run() { 581 for (int i = 0; i < SIZE; i++) { 582 mDatabase 583 .query("t1", COLUMNS, where[i], null, null, null, null); 584 } 585 } 586 } 587 588 /** 589 * 100 SELECTs on integer 590 */ 591 592 public static class Perf11Test extends PerformanceBase { 593 private static final int SIZE = 100; 594 private static final String[] COLUMNS = {"b"}; 595 596 private String[] where = new String[SIZE]; 597 598 @Override 599 public void setUp(Context c) { 600 super.setUp(c); 601 Random random = new Random(42); 602 603 mDatabase 604 .execSQL("CREATE TABLE t1(a INTEGER, b INTEGER, c VARCHAR(100))"); 605 606 for (int i = 0; i < SIZE; i++) { 607 int r = random.nextInt(100000); 608 mDatabase.execSQL("INSERT INTO t1 VALUES(" + i + "," + r + ",'" 609 + numberName(r) + "')"); 610 } 611 612 } 613 614 @Override 615 public void run() { 616 for (int i = 0; i < SIZE; i++) { 617 mDatabase.query("t1", COLUMNS, null, null, null, null, null); 618 } 619 } 620 } 621 622 /** 623 * 100 SELECTs on String 624 */ 625 626 public static class Perf12Test extends PerformanceBase { 627 private static final int SIZE = 100; 628 private static final String[] COLUMNS = {"c"}; 629 630 private String[] where = new String[SIZE]; 631 632 @Override 633 public void setUp(Context c) { 634 super.setUp(c); 635 Random random = new Random(42); 636 637 mDatabase 638 .execSQL("CREATE TABLE t1(a INTEGER, b INTEGER, c VARCHAR(100))"); 639 640 for (int i = 0; i < SIZE; i++) { 641 int r = random.nextInt(100000); 642 mDatabase.execSQL("INSERT INTO t1 VALUES(" + i + "," + r + ",'" 643 + numberName(r) + "')"); 644 } 645 646 } 647 648 @Override 649 public void run() { 650 for (int i = 0; i < SIZE; i++) { 651 mDatabase.query("t1", COLUMNS, null, null, null, null, null); 652 } 653 } 654 } 655 656 /** 657 * 100 SELECTs on integer with index 658 */ 659 660 public static class Perf13Test extends PerformanceBase { 661 private static final int SIZE = 100; 662 private static final String[] COLUMNS = {"b"}; 663 664 @Override 665 public void setUp(Context c) { 666 super.setUp(c); 667 Random random = new Random(42); 668 669 mDatabase 670 .execSQL("CREATE TABLE t1(a INTEGER, b INTEGER, c VARCHAR(100))"); 671 mDatabase.execSQL("CREATE INDEX i1b on t1(b)"); 672 673 for (int i = 0; i < SIZE; i++) { 674 int r = random.nextInt(100000); 675 mDatabase.execSQL("INSERT INTO t1 VALUES(" + i + "," + r + ",'" 676 + numberName(r) + "')"); 677 } 678 679 } 680 681 @Override 682 public void run() { 683 for (int i = 0; i < SIZE; i++) { 684 mDatabase.query("t1", COLUMNS, null, null, null, null, null); 685 } 686 } 687 } 688 689 /** 690 * 100 SELECTs on String with index 691 */ 692 693 public static class Perf14Test extends PerformanceBase { 694 private static final int SIZE = 100; 695 private static final String[] COLUMNS = {"c"}; 696 697 @Override 698 public void setUp(Context c) { 699 super.setUp(c); 700 Random random = new Random(42); 701 702 mDatabase 703 .execSQL("CREATE TABLE t1(a INTEGER, b INTEGER, c VARCHAR(100))"); 704 mDatabase.execSQL("CREATE INDEX i1c ON t1(c)"); 705 706 for (int i = 0; i < SIZE; i++) { 707 int r = random.nextInt(100000); 708 mDatabase.execSQL("INSERT INTO t1 VALUES(" + i + "," + r + ",'" 709 + numberName(r) + "')"); 710 } 711 712 } 713 714 @Override 715 public void run() { 716 for (int i = 0; i < SIZE; i++) { 717 mDatabase.query("t1", COLUMNS, null, null, null, null, null); 718 } 719 } 720 } 721 722 /** 723 * 100 SELECTs on String with starts with 724 */ 725 726 public static class Perf15Test extends PerformanceBase { 727 private static final int SIZE = 100; 728 private static final String[] COLUMNS = {"c"}; 729 private String[] where = new String[SIZE]; 730 731 @Override 732 public void setUp(Context c) { 733 super.setUp(c); 734 Random random = new Random(42); 735 736 mDatabase 737 .execSQL("CREATE TABLE t1(a INTEGER, b INTEGER, c VARCHAR(100))"); 738 mDatabase.execSQL("CREATE INDEX i1c ON t1(c)"); 739 740 for (int i = 0; i < SIZE; i++) { 741 int r = random.nextInt(100000); 742 mDatabase.execSQL("INSERT INTO t1 VALUES(" + i + "," + r + ",'" 743 + numberName(r) + "')"); 744 } 745 746 for (int i = 0; i < SIZE; i++) { 747 int r = random.nextInt(100000); 748 where[i] = "c LIKE '" + numberName(r).substring(0, 1) + "*'"; 749 750 } 751 752 } 753 754 @Override 755 public void run() { 756 for (int i = 0; i < SIZE; i++) { 757 mDatabase 758 .query("t1", COLUMNS, where[i], null, null, null, null); 759 } 760 } 761 } 762 763 /** 764 * 1000 Deletes on an indexed table 765 */ 766 767 public static class Perf16Test extends PerformanceBase { 768 private static final int SIZE = 1000; 769 private static final String[] COLUMNS = {"c"}; 770 771 @Override 772 public void setUp(Context c) { 773 super.setUp(c); 774 Random random = new Random(42); 775 776 mDatabase 777 .execSQL("CREATE TABLE t1(a INTEGER, b INTEGER, c VARCHAR(100))"); 778 mDatabase.execSQL("CREATE INDEX i3c ON t1(c)"); 779 780 for (int i = 0; i < SIZE; i++) { 781 int r = random.nextInt(100000); 782 mDatabase.execSQL("INSERT INTO t1 VALUES(" + i + "," + r + ",'" 783 + numberName(r) + "')"); 784 } 785 786 } 787 788 @Override 789 public void run() { 790 for (int i = 0; i < SIZE; i++) { 791 mDatabase.delete("t1", null, null); 792 } 793 } 794 } 795 796 /** 797 * 1000 Deletes 798 */ 799 800 public static class Perf17Test extends PerformanceBase { 801 private static final int SIZE = 1000; 802 private static final String[] COLUMNS = {"c"}; 803 804 @Override 805 public void setUp(Context c) { 806 super.setUp(c); 807 Random random = new Random(42); 808 809 mDatabase 810 .execSQL("CREATE TABLE t1(a INTEGER, b INTEGER, c VARCHAR(100))"); 811 812 for (int i = 0; i < SIZE; i++) { 813 int r = random.nextInt(100000); 814 mDatabase.execSQL("INSERT INTO t1 VALUES(" + i + "," + r + ",'" 815 + numberName(r) + "')"); 816 } 817 818 } 819 820 @Override 821 public void run() { 822 for (int i = 0; i < SIZE; i++) { 823 mDatabase.delete("t1", null, null); 824 } 825 } 826 } 827 828 /** 829 * 1000 DELETE's without an index with where clause 830 */ 831 832 public static class Perf18Test extends PerformanceBase { 833 private static final int SIZE = 1000; 834 private String[] where = new String[SIZE]; 835 836 @Override 837 public void setUp(Context c) { 838 super.setUp(c); 839 Random random = new Random(42); 840 841 mDatabase 842 .execSQL("CREATE TABLE t1(a INTEGER, b INTEGER, c VARCHAR(100))"); 843 844 for (int i = 0; i < SIZE; i++) { 845 int r = random.nextInt(100000); 846 mDatabase.execSQL("INSERT INTO t1 VALUES(" + i + "," + r + ",'" 847 + numberName(r) + "')"); 848 } 849 850 for (int i = 0; i < SIZE; i++) { 851 int lower = i * 100; 852 int upper = (i + 10) * 100; 853 where[i] = "b >= " + lower + " AND b < " + upper; 854 } 855 } 856 857 @Override 858 public void run() { 859 for (int i = 0; i < SIZE; i++) { 860 mDatabase.delete("t1", where[i], null); 861 } 862 } 863 } 864 865 /** 866 * 1000 DELETE's with an index with where clause 867 */ 868 869 public static class Perf19Test extends PerformanceBase { 870 private static final int SIZE = 1000; 871 private String[] where = new String[SIZE]; 872 873 @Override 874 public void setUp(Context c) { 875 super.setUp(c); 876 Random random = new Random(42); 877 878 mDatabase 879 .execSQL("CREATE TABLE t1(a INTEGER, b INTEGER, c VARCHAR(100))"); 880 mDatabase.execSQL("CREATE INDEX i1b ON t1(b)"); 881 882 for (int i = 0; i < SIZE; i++) { 883 int r = random.nextInt(100000); 884 mDatabase.execSQL("INSERT INTO t1 VALUES(" + i + "," + r + ",'" 885 + numberName(r) + "')"); 886 } 887 888 for (int i = 0; i < SIZE; i++) { 889 int lower = i * 100; 890 int upper = (i + 10) * 100; 891 where[i] = "b >= " + lower + " AND b < " + upper; 892 } 893 } 894 895 @Override 896 public void run() { 897 for (int i = 0; i < SIZE; i++) { 898 mDatabase.delete("t1", where[i], null); 899 } 900 } 901 } 902 903 /** 904 * 1000 update's with an index with where clause 905 */ 906 907 public static class Perf20Test extends PerformanceBase { 908 private static final int SIZE = 1000; 909 private String[] where = new String[SIZE]; 910 ContentValues[] mValues = new ContentValues[SIZE]; 911 912 @Override 913 public void setUp(Context c) { 914 super.setUp(c); 915 Random random = new Random(42); 916 917 mDatabase 918 .execSQL("CREATE TABLE t1(a INTEGER, b INTEGER, c VARCHAR(100))"); 919 mDatabase.execSQL("CREATE INDEX i1b ON t1(b)"); 920 921 for (int i = 0; i < SIZE; i++) { 922 int r = random.nextInt(100000); 923 mDatabase.execSQL("INSERT INTO t1 VALUES(" + i + "," + r + ",'" 924 + numberName(r) + "')"); 925 } 926 927 for (int i = 0; i < SIZE; i++) { 928 929 int lower = i * 100; 930 int upper = (i + 10) * 100; 931 where[i] = "b >= " + lower + " AND b < " + upper; 932 ContentValues b = new ContentValues(1); 933 b.put("b", upper); 934 mValues[i] = b; 935 936 } 937 } 938 939 @Override 940 public void run() { 941 for (int i = 0; i < SIZE; i++) { 942 mDatabase.update("t1", mValues[i], where[i], null); 943 } 944 } 945 } 946 947 /** 948 * 1000 update's without an index with where clause 949 */ 950 951 public static class Perf21Test extends PerformanceBase { 952 private static final int SIZE = 1000; 953 private String[] where = new String[SIZE]; 954 ContentValues[] mValues = new ContentValues[SIZE]; 955 956 @Override 957 public void setUp(Context c) { 958 super.setUp(c); 959 Random random = new Random(42); 960 961 mDatabase 962 .execSQL("CREATE TABLE t1(a INTEGER, b INTEGER, c VARCHAR(100))"); 963 964 for (int i = 0; i < SIZE; i++) { 965 int r = random.nextInt(100000); 966 mDatabase.execSQL("INSERT INTO t1 VALUES(" + i + "," + r + ",'" 967 + numberName(r) + "')"); 968 } 969 970 for (int i = 0; i < SIZE; i++) { 971 972 int lower = i * 100; 973 int upper = (i + 10) * 100; 974 where[i] = "b >= " + lower + " AND b < " + upper; 975 ContentValues b = new ContentValues(1); 976 b.put("b", upper); 977 mValues[i] = b; 978 } 979 } 980 981 @Override 982 public void run() { 983 for (int i = 0; i < SIZE; i++) { 984 mDatabase.update("t1", mValues[i], where[i], null); 985 } 986 } 987 } 988 989 /** 990 * 10000 inserts for an integer 991 */ 992 993 public static class Perf22Test extends PerformanceBase { 994 private static final int SIZE = 10000; 995 ContentValues[] mValues = new ContentValues[SIZE]; 996 997 @Override 998 public void setUp(Context c) { 999 super.setUp(c); 1000 Random random = new Random(42); 1001 1002 mDatabase 1003 .execSQL("CREATE TABLE t1(a INTEGER)"); 1004 1005 for (int i = 0; i < SIZE; i++) { 1006 int r = random.nextInt(100000); 1007 ContentValues b = new ContentValues(1); 1008 b.put("a", r); 1009 mValues[i] = b; 1010 } 1011 } 1012 1013 @Override 1014 public void run() { 1015 for (int i = 0; i < SIZE; i++) { 1016 mDatabase.insert("t1", null, mValues[i]); 1017 } 1018 } 1019 } 1020 1021 /** 1022 * 10000 inserts for an integer -indexed table 1023 */ 1024 1025 public static class Perf23Test extends PerformanceBase { 1026 private static final int SIZE = 10000; 1027 ContentValues[] mValues = new ContentValues[SIZE]; 1028 1029 @Override 1030 public void setUp(Context c) { 1031 super.setUp(c); 1032 Random random = new Random(42); 1033 1034 mDatabase 1035 .execSQL("CREATE TABLE t1(a INTEGER)"); 1036 mDatabase.execSQL("CREATE INDEX i1a ON t1(a)"); 1037 1038 for (int i = 0; i < SIZE; i++) { 1039 int r = random.nextInt(100000); 1040 ContentValues b = new ContentValues(1); 1041 b.put("a", r); 1042 mValues[i] = b; 1043 } 1044 } 1045 1046 @Override 1047 public void run() { 1048 for (int i = 0; i < SIZE; i++) { 1049 mDatabase.insert("t1", null, mValues[i]); 1050 } 1051 } 1052 } 1053 1054 /** 1055 * 10000 inserts for a String 1056 */ 1057 1058 public static class Perf24Test extends PerformanceBase { 1059 private static final int SIZE = 10000; 1060 ContentValues[] mValues = new ContentValues[SIZE]; 1061 1062 @Override 1063 public void setUp(Context c) { 1064 super.setUp(c); 1065 Random random = new Random(42); 1066 1067 mDatabase 1068 .execSQL("CREATE TABLE t1(a VARCHAR(100))"); 1069 1070 for (int i = 0; i < SIZE; i++) { 1071 int r = random.nextInt(100000); 1072 ContentValues b = new ContentValues(1); 1073 b.put("a", numberName(r)); 1074 mValues[i] = b; 1075 } 1076 } 1077 1078 @Override 1079 public void run() { 1080 for (int i = 0; i < SIZE; i++) { 1081 mDatabase.insert("t1", null, mValues[i]); 1082 } 1083 } 1084 } 1085 1086 /** 1087 * 10000 inserts for a String - indexed table 1088 */ 1089 1090 public static class Perf25Test extends PerformanceBase { 1091 private static final int SIZE = 10000; 1092 ContentValues[] mValues = new ContentValues[SIZE]; 1093 1094 @Override 1095 public void setUp(Context c) { 1096 super.setUp(c); 1097 Random random = new Random(42); 1098 1099 mDatabase 1100 .execSQL("CREATE TABLE t1(a VARCHAR(100))"); 1101 mDatabase.execSQL("CREATE INDEX i1a ON t1(a)"); 1102 1103 for (int i = 0; i < SIZE; i++) { 1104 int r = random.nextInt(100000); 1105 ContentValues b = new ContentValues(1); 1106 b.put("a", numberName(r)); 1107 mValues[i] = b; 1108 } 1109 } 1110 1111 @Override 1112 public void run() { 1113 for (int i = 0; i < SIZE; i++) { 1114 mDatabase.insert("t1", null, mValues[i]); 1115 } 1116 } 1117 } 1118 1119 1120 /** 1121 * 10000 selects for a String -starts with 1122 */ 1123 1124 public static class Perf26Test extends PerformanceBase { 1125 private static final int SIZE = 10000; 1126 private static final String[] COLUMNS = {"t3.a"}; 1127 private String[] where = new String[SIZE]; 1128 1129 @Override 1130 public void setUp(Context c) { 1131 super.setUp(c); 1132 Random random = new Random(42); 1133 1134 mDatabase 1135 .execSQL("CREATE TABLE t3(a VARCHAR(100))"); 1136 1137 for (int i = 0; i < SIZE; i++) { 1138 int r = random.nextInt(100000); 1139 mDatabase.execSQL("INSERT INTO t3 VALUES('" 1140 + numberName(r) + "')"); 1141 } 1142 1143 for (int i = 0; i < SIZE; i++) { 1144 int r = random.nextInt(100000); 1145 where[i] = "a LIKE '" + numberName(r).substring(0, 1) + "*'"; 1146 1147 } 1148 } 1149 1150 @Override 1151 public void run() { 1152 for (int i = 0; i < SIZE; i++) { 1153 mDatabase.query("t3", COLUMNS, where[i], null, null, null, null); 1154 } 1155 } 1156 } 1157 1158 /** 1159 * 10000 selects for a String - indexed table -starts with 1160 */ 1161 1162 public static class Perf27Test extends PerformanceBase { 1163 private static final int SIZE = 10000; 1164 private static final String[] COLUMNS = {"t3.a"}; 1165 private String[] where = new String[SIZE]; 1166 1167 @Override 1168 public void setUp(Context c) { 1169 super.setUp(c); 1170 Random random = new Random(42); 1171 1172 mDatabase 1173 .execSQL("CREATE TABLE t3(a VARCHAR(100))"); 1174 mDatabase.execSQL("CREATE INDEX i3a ON t3(a)"); 1175 1176 for (int i = 0; i < SIZE; i++) { 1177 int r = random.nextInt(100000); 1178 mDatabase.execSQL("INSERT INTO t3 VALUES('" 1179 + numberName(r) + "')"); 1180 } 1181 1182 for (int i = 0; i < SIZE; i++) { 1183 int r = random.nextInt(100000); 1184 where[i] = "a LIKE '" + numberName(r).substring(0, 1) + "*'"; 1185 1186 } 1187 } 1188 1189 @Override 1190 public void run() { 1191 for (int i = 0; i < SIZE; i++) { 1192 mDatabase.query("t3", COLUMNS, where[i], null, null, null, null); 1193 } 1194 } 1195 } 1196 1197 /** 1198 * 10000 selects for an integer - 1199 */ 1200 1201 public static class Perf28Test extends PerformanceBase { 1202 private static final int SIZE = 10000; 1203 private static final String[] COLUMNS = {"t4.a"}; 1204 private String[] where = new String[SIZE]; 1205 1206 @Override 1207 public void setUp(Context c) { 1208 super.setUp(c); 1209 Random random = new Random(42); 1210 1211 mDatabase 1212 .execSQL("CREATE TABLE t4(a INTEGER)"); 1213 1214 for (int i = 0; i < SIZE; i++) { 1215 int r = random.nextInt(100000); 1216 mDatabase.execSQL("INSERT INTO t4 VALUES(" + r + ")"); 1217 int lower = i * 100; 1218 int upper = (i + 10) * 100; 1219 where[i] = "a >= " + lower + " AND a < " + upper; 1220 } 1221 } 1222 1223 @Override 1224 public void run() { 1225 for (int i = 0; i < SIZE; i++) { 1226 mDatabase.query("t4", COLUMNS, where[i], null, null, null, null); 1227 } 1228 } 1229 } 1230 1231 /** 1232 * 10000 selects for an integer -indexed table 1233 */ 1234 1235 public static class Perf29Test extends PerformanceBase { 1236 private static final int SIZE = 10000; 1237 private static final String[] COLUMNS = {"t4.a"}; 1238 private String[] where = new String[SIZE]; 1239 1240 @Override 1241 public void setUp(Context c) { 1242 super.setUp(c); 1243 Random random = new Random(42); 1244 1245 mDatabase 1246 .execSQL("CREATE TABLE t4(a INTEGER)"); 1247 mDatabase.execSQL("CREATE INDEX i4a ON t4(a)"); 1248 1249 for (int i = 0; i < SIZE; i++) { 1250 int r = random.nextInt(100000); 1251 mDatabase.execSQL("INSERT INTO t4 VALUES(" + r + ")"); 1252 1253 int lower = i * 100; 1254 int upper = (i + 10) * 100; 1255 where[i] = "a >= " + lower + " AND a < " + upper; 1256 } 1257 1258 } 1259 1260 @Override 1261 public void run() { 1262 for (int i = 0; i < SIZE; i++) { 1263 mDatabase.query("t4", COLUMNS, where[i], null, null, null, null); 1264 } 1265 } 1266 } 1267 1268 1269 /** 1270 * 10000 selects for a String - contains 'e' 1271 */ 1272 1273 public static class Perf30Test extends PerformanceBase { 1274 private static final int SIZE = 10000; 1275 private static final String[] COLUMNS = {"t3.a"}; 1276 private String[] where = new String[SIZE]; 1277 1278 @Override 1279 public void setUp(Context c) { 1280 super.setUp(c); 1281 Random random = new Random(42); 1282 1283 mDatabase 1284 .execSQL("CREATE TABLE t3(a VARCHAR(100))"); 1285 1286 for (int i = 0; i < SIZE; i++) { 1287 int r = random.nextInt(100000); 1288 mDatabase.execSQL("INSERT INTO t3 VALUES('" 1289 + numberName(r) + "')"); 1290 } 1291 1292 for (int i = 0; i < SIZE; i++) { 1293 where[i] = "a LIKE '*e*'"; 1294 1295 } 1296 } 1297 1298 @Override 1299 public void run() { 1300 for (int i = 0; i < SIZE; i++) { 1301 mDatabase.query("t3", COLUMNS, where[i], null, null, null, null); 1302 } 1303 } 1304 } 1305 1306 /** 1307 * 10000 selects for a String - contains 'e'-indexed table 1308 */ 1309 1310 public static class Perf31Test extends PerformanceBase { 1311 private static final int SIZE = 10000; 1312 private static final String[] COLUMNS = {"t3.a"}; 1313 private String[] where = new String[SIZE]; 1314 1315 @Override 1316 public void setUp(Context c) { 1317 super.setUp(c); 1318 Random random = new Random(42); 1319 1320 mDatabase 1321 .execSQL("CREATE TABLE t3(a VARCHAR(100))"); 1322 mDatabase.execSQL("CREATE INDEX i3a ON t3(a)"); 1323 1324 for (int i = 0; i < SIZE; i++) { 1325 int r = random.nextInt(100000); 1326 mDatabase.execSQL("INSERT INTO t3 VALUES('" 1327 + numberName(r) + "')"); 1328 } 1329 1330 for (int i = 0; i < SIZE; i++) { 1331 where[i] = "a LIKE '*e*'"; 1332 1333 } 1334 1335 } 1336 1337 @Override 1338 public void run() { 1339 for (int i = 0; i < SIZE; i++) { 1340 mDatabase.query("t3", COLUMNS, where[i], null, null, null, null); 1341 } 1342 } 1343 } 1344 1345 public static final String[] ONES = 1346 {"zero", "one", "two", "three", "four", "five", "six", "seven", 1347 "eight", "nine", "ten", "eleven", "twelve", "thirteen", 1348 "fourteen", "fifteen", "sixteen", "seventeen", "eighteen", 1349 "nineteen"}; 1350 1351 public static final String[] TENS = 1352 {"", "ten", "twenty", "thirty", "forty", "fifty", "sixty", 1353 "seventy", "eighty", "ninety"}; 1354 } 1355