Annotation of embedaddon/sqlite3/tool/speedtest8.c, revision 1.1.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>