aboutsummaryrefslogtreecommitdiff
path: root/tests/sqlite/benchmark.c
blob: 04dc150a2a9ef746e27cf3cc82445cb4a9cae57f (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
#include <time.h>
#include <stdio.h>
#include <stdlib.h>
#include <sqlite3.h>

#include <emscripten.h>

int print = 1;

static int callback(void *NotUsed, int argc, char **argv, char **azColName){
  int i;
  if (!print) return 0;
  for(i=0; i<argc; i++){
    printf("%s = %s\n", azColName[i], argv[i] ? argv[i] : "NULL");
  }
  printf("\n");
  return 0;
}

int test(){
  sqlite3 *db;
  char *zErrMsg = 0;
  int rc;
  int i;
  const char *commands[] = {
    "CREATE TABLE t2(a INTEGER, b INTEGER, c VARCHAR(100));",
    "INSERT INTO t2 VALUES(1,13153,'thirteen thousand one hundred fifty three');",
    "INSERT INTO t2 VALUES(1,987,'some other number');",
    "SELECT count(*) FROM t2;",
    "SELECT datetime('2012-04-16 12:35:57', '+1 days');",
    "SELECT a, b, c FROM t2;",
    NULL
  };

  rc = sqlite3_open(":memory:", &db);
  if( rc ){
    fprintf(stderr, "Can't open database: %s\n", sqlite3_errmsg(db));
    sqlite3_close(db);
    exit(1);
  }
  for (i = 0; commands[i]; i++) {
    rc = sqlite3_exec(db, commands[i], callback, 0, &zErrMsg);
    if( rc!=SQLITE_OK ){
      fprintf(stderr, "SQL error on %d: %s\n", i, zErrMsg);
      sqlite3_free(zErrMsg);
      exit(1);
    }
  }
  sqlite3_close(db);
  return 0;
}

int main(int argc, char **argv){
  sqlite3 *db;
  char *zErrMsg = 0;
  int rc, i;
  clock_t t;
  int n, m;

  n = argc > 1 ? atoi(argv[1]) : 5000;
  m = argc > 2 ? atoi(argv[2]) : 1;

  rc = sqlite3_open(":memory:", &db);
  if( rc ){
    fprintf(stderr, "Can't open database: %s\n", sqlite3_errmsg(db));
    sqlite3_close(db);
    exit(1);
  }

  #define RUN(cmd) \
    { \
      rc = sqlite3_exec(db, cmd, callback, 0, &zErrMsg); \
      if( rc!=SQLITE_OK ){ \
        fprintf(stderr, "SQL error on %d: %s\n", i, zErrMsg); \
        sqlite3_free(zErrMsg); \
        exit(1); \
      } \
    }

  #define TIME(msg) \
    { \
      int now = emscripten_get_now(); \
      printf(msg " : took %d ms\n", (int)(now - t)); \
      t = now; \
    }

  t = clock();
  TIME("'startup' - IGNORE THIS VALUE, it is an artifact");

  RUN("CREATE TABLE t1(a INTEGER, b INTEGER, c VARCHAR(100));");
  TIME("create table");

  RUN("BEGIN;");

  // n*5 INSERTs in a transaction
  for (i = 0; i < n; i++) {
    RUN("INSERT INTO t1 VALUES(1,12345,'one 1 one 1 one 1');");
    RUN("INSERT INTO t1 VALUES(2,23422,'two two two two');");
    RUN("INSERT INTO t1 VALUES(3,31233,'three three 33333333333 three');");
    RUN("INSERT INTO t1 VALUES(4,41414,'FOUR four 4 phor FOUR 44444');");
    RUN("INSERT INTO t1 VALUES(5,52555,'five 5 FIVE Five phayve 55 5 5 5 5 55  5');");
  }
  TIME("25,000 inserts");

  RUN("COMMIT;");
  TIME("commit");

  // Counts
  for (i = 0; i < m; i++) {
    print = i == 0;
    RUN("SELECT count(*) FROM t1;");
    RUN("SELECT count(*) FROM t1 WHERE a == 4");
    RUN("SELECT count(*) FROM t1 WHERE b > 20000 AND b < 50000;");
    RUN("SELECT count(*) FROM t1 WHERE c like '%three%';");
  }
  TIME("selects");

  // Index
  RUN("CREATE INDEX iiaa ON t1(a);");
  RUN("CREATE INDEX iibb ON t1(b);");
  TIME("create indexes");

  for (i = 0; i < m; i++) {
    print = i == 0;
    RUN("SELECT count(*) FROM t1 WHERE a == 4");
    RUN("SELECT count(*) FROM t1 WHERE b > 20000 AND b < 50000;");
  }
  TIME("selects with indexes");

  sqlite3_close(db);

  return test();
}