Annotation of embedaddon/sqlite3/tool/speedtest8.c, revision 1.1
1.1 ! misho 1: /*
! 2: ** Performance test for SQLite.
! 3: **
! 4: ** This program reads ASCII text from a file named on the command-line
! 5: ** and submits that text to SQLite for evaluation. A new database
! 6: ** is created at the beginning of the program. All statements are
! 7: ** timed using the high-resolution timer built into Intel-class processors.
! 8: **
! 9: ** To compile this program, first compile the SQLite library separately
! 10: ** will full optimizations. For example:
! 11: **
! 12: ** gcc -c -O6 -DSQLITE_THREADSAFE=0 sqlite3.c
! 13: **
! 14: ** Then link against this program. But to do optimize this program
! 15: ** because that defeats the hi-res timer.
! 16: **
! 17: ** gcc speedtest8.c sqlite3.o -ldl -I../src
! 18: **
! 19: ** Then run this program with a single argument which is the name of
! 20: ** a file containing SQL script that you want to test:
! 21: **
! 22: ** ./a.out test.db test.sql
! 23: */
! 24: #include <stdio.h>
! 25: #include <string.h>
! 26: #include <stdlib.h>
! 27: #include <ctype.h>
! 28: #include <time.h>
! 29:
! 30: #if defined(_MSC_VER)
! 31: #include <windows.h>
! 32: #else
! 33: #include <unistd.h>
! 34: #include <sys/times.h>
! 35: #include <sched.h>
! 36: #endif
! 37:
! 38: #include "sqlite3.h"
! 39:
! 40: /*
! 41: ** hwtime.h contains inline assembler code for implementing
! 42: ** high-performance timing routines.
! 43: */
! 44: #include "hwtime.h"
! 45:
! 46: /*
! 47: ** Timers
! 48: */
! 49: static sqlite_uint64 prepTime = 0;
! 50: static sqlite_uint64 runTime = 0;
! 51: static sqlite_uint64 finalizeTime = 0;
! 52:
! 53: /*
! 54: ** Prepare and run a single statement of SQL.
! 55: */
! 56: static void prepareAndRun(sqlite3 *db, const char *zSql, int bQuiet){
! 57: sqlite3_stmt *pStmt;
! 58: const char *stmtTail;
! 59: sqlite_uint64 iStart, iElapse;
! 60: int rc;
! 61:
! 62: if (!bQuiet){
! 63: printf("***************************************************************\n");
! 64: }
! 65: if (!bQuiet) printf("SQL statement: [%s]\n", zSql);
! 66: iStart = sqlite3Hwtime();
! 67: rc = sqlite3_prepare_v2(db, zSql, -1, &pStmt, &stmtTail);
! 68: iElapse = sqlite3Hwtime() - iStart;
! 69: prepTime += iElapse;
! 70: if (!bQuiet){
! 71: printf("sqlite3_prepare_v2() returns %d in %llu cycles\n", rc, iElapse);
! 72: }
! 73: if( rc==SQLITE_OK ){
! 74: int nRow = 0;
! 75: iStart = sqlite3Hwtime();
! 76: while( (rc=sqlite3_step(pStmt))==SQLITE_ROW ){ nRow++; }
! 77: iElapse = sqlite3Hwtime() - iStart;
! 78: runTime += iElapse;
! 79: if (!bQuiet){
! 80: printf("sqlite3_step() returns %d after %d rows in %llu cycles\n",
! 81: rc, nRow, iElapse);
! 82: }
! 83: iStart = sqlite3Hwtime();
! 84: rc = sqlite3_finalize(pStmt);
! 85: iElapse = sqlite3Hwtime() - iStart;
! 86: finalizeTime += iElapse;
! 87: if (!bQuiet){
! 88: printf("sqlite3_finalize() returns %d in %llu cycles\n", rc, iElapse);
! 89: }
! 90: }
! 91: }
! 92:
! 93: int main(int argc, char **argv){
! 94: sqlite3 *db;
! 95: int rc;
! 96: int nSql;
! 97: char *zSql;
! 98: int i, j;
! 99: FILE *in;
! 100: sqlite_uint64 iStart, iElapse;
! 101: sqlite_uint64 iSetup = 0;
! 102: int nStmt = 0;
! 103: int nByte = 0;
! 104: const char *zArgv0 = argv[0];
! 105: int bQuiet = 0;
! 106: #if !defined(_MSC_VER)
! 107: struct tms tmsStart, tmsEnd;
! 108: clock_t clkStart, clkEnd;
! 109: #endif
! 110:
! 111: #ifdef HAVE_OSINST
! 112: extern sqlite3_vfs *sqlite3_instvfs_binarylog(char *, char *, char *);
! 113: extern void sqlite3_instvfs_destroy(sqlite3_vfs *);
! 114: sqlite3_vfs *pVfs = 0;
! 115: #endif
! 116:
! 117: while (argc>3)
! 118: {
! 119: #ifdef HAVE_OSINST
! 120: if( argc>4 && (strcmp(argv[1], "-log")==0) ){
! 121: pVfs = sqlite3_instvfs_binarylog("oslog", 0, argv[2]);
! 122: sqlite3_vfs_register(pVfs, 1);
! 123: argv += 2;
! 124: argc -= 2;
! 125: continue;
! 126: }
! 127: #endif
! 128:
! 129: /*
! 130: ** Increasing the priority slightly above normal can help with
! 131: ** repeatability of testing. Note that with Cygwin, -5 equates
! 132: ** to "High", +5 equates to "Low", and anything in between
! 133: ** equates to "Normal".
! 134: */
! 135: if( argc>4 && (strcmp(argv[1], "-priority")==0) ){
! 136: #if defined(_MSC_VER)
! 137: int new_priority = atoi(argv[2]);
! 138: if(!SetPriorityClass(GetCurrentProcess(),
! 139: (new_priority<=-5) ? HIGH_PRIORITY_CLASS :
! 140: (new_priority<=0) ? ABOVE_NORMAL_PRIORITY_CLASS :
! 141: (new_priority==0) ? NORMAL_PRIORITY_CLASS :
! 142: (new_priority<5) ? BELOW_NORMAL_PRIORITY_CLASS :
! 143: IDLE_PRIORITY_CLASS)){
! 144: printf ("error setting priority\n");
! 145: exit(2);
! 146: }
! 147: #else
! 148: struct sched_param myParam;
! 149: sched_getparam(0, &myParam);
! 150: printf ("Current process priority is %d.\n", (int)myParam.sched_priority);
! 151: myParam.sched_priority = atoi(argv[2]);
! 152: printf ("Setting process priority to %d.\n", (int)myParam.sched_priority);
! 153: if (sched_setparam (0, &myParam) != 0){
! 154: printf ("error setting priority\n");
! 155: exit(2);
! 156: }
! 157: #endif
! 158: argv += 2;
! 159: argc -= 2;
! 160: continue;
! 161: }
! 162:
! 163: if( argc>3 && strcmp(argv[1], "-quiet")==0 ){
! 164: bQuiet = -1;
! 165: argv++;
! 166: argc--;
! 167: continue;
! 168: }
! 169:
! 170: break;
! 171: }
! 172:
! 173: if( argc!=3 ){
! 174: fprintf(stderr, "Usage: %s [options] FILENAME SQL-SCRIPT\n"
! 175: "Runs SQL-SCRIPT against a UTF8 database\n"
! 176: "\toptions:\n"
! 177: #ifdef HAVE_OSINST
! 178: "\t-log <log>\n"
! 179: #endif
! 180: "\t-priority <value> : set priority of task\n"
! 181: "\t-quiet : only display summary results\n",
! 182: zArgv0);
! 183: exit(1);
! 184: }
! 185:
! 186: in = fopen(argv[2], "r");
! 187: fseek(in, 0L, SEEK_END);
! 188: nSql = ftell(in);
! 189: zSql = malloc( nSql+1 );
! 190: fseek(in, 0L, SEEK_SET);
! 191: nSql = fread(zSql, 1, nSql, in);
! 192: zSql[nSql] = 0;
! 193:
! 194: printf("SQLite version: %d\n", sqlite3_libversion_number());
! 195: unlink(argv[1]);
! 196: #if !defined(_MSC_VER)
! 197: clkStart = times(&tmsStart);
! 198: #endif
! 199: iStart = sqlite3Hwtime();
! 200: rc = sqlite3_open(argv[1], &db);
! 201: iElapse = sqlite3Hwtime() - iStart;
! 202: iSetup = iElapse;
! 203: if (!bQuiet) printf("sqlite3_open() returns %d in %llu cycles\n", rc, iElapse);
! 204: for(i=j=0; j<nSql; j++){
! 205: if( zSql[j]==';' ){
! 206: int isComplete;
! 207: char c = zSql[j+1];
! 208: zSql[j+1] = 0;
! 209: isComplete = sqlite3_complete(&zSql[i]);
! 210: zSql[j+1] = c;
! 211: if( isComplete ){
! 212: zSql[j] = 0;
! 213: while( i<j && isspace(zSql[i]) ){ i++; }
! 214: if( i<j ){
! 215: int n = j - i;
! 216: if( n>=6 && memcmp(&zSql[i], ".crash",6)==0 ) exit(1);
! 217: nStmt++;
! 218: nByte += n;
! 219: prepareAndRun(db, &zSql[i], bQuiet);
! 220: }
! 221: zSql[j] = ';';
! 222: i = j+1;
! 223: }
! 224: }
! 225: }
! 226: iStart = sqlite3Hwtime();
! 227: sqlite3_close(db);
! 228: iElapse = sqlite3Hwtime() - iStart;
! 229: #if !defined(_MSC_VER)
! 230: clkEnd = times(&tmsEnd);
! 231: #endif
! 232: iSetup += iElapse;
! 233: if (!bQuiet) printf("sqlite3_close() returns in %llu cycles\n", iElapse);
! 234:
! 235: printf("\n");
! 236: printf("Statements run: %15d stmts\n", nStmt);
! 237: printf("Bytes of SQL text: %15d bytes\n", nByte);
! 238: printf("Total prepare time: %15llu cycles\n", prepTime);
! 239: printf("Total run time: %15llu cycles\n", runTime);
! 240: printf("Total finalize time: %15llu cycles\n", finalizeTime);
! 241: printf("Open/Close time: %15llu cycles\n", iSetup);
! 242: printf("Total time: %15llu cycles\n",
! 243: prepTime + runTime + finalizeTime + iSetup);
! 244:
! 245: #if !defined(_MSC_VER)
! 246: printf("\n");
! 247: printf("Total user CPU time: %15.3g secs\n", (tmsEnd.tms_utime - tmsStart.tms_utime)/(double)CLOCKS_PER_SEC );
! 248: printf("Total system CPU time: %15.3g secs\n", (tmsEnd.tms_stime - tmsStart.tms_stime)/(double)CLOCKS_PER_SEC );
! 249: printf("Total real time: %15.3g secs\n", (clkEnd -clkStart)/(double)CLOCKS_PER_SEC );
! 250: #endif
! 251:
! 252: #ifdef HAVE_OSINST
! 253: if( pVfs ){
! 254: sqlite3_instvfs_destroy(pVfs);
! 255: printf("vfs log written to %s\n", argv[0]);
! 256: }
! 257: #endif
! 258:
! 259: return 0;
! 260: }
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>