Annotation of embedaddon/sqlite3/tool/speedtest16.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: ** It converts each SQL statement into UTF16 and submits it to SQLite
                      6: ** for evaluation.  A new UTF16 database is created at the beginning of
                      7: ** the program.  All statements are timed using the high-resolution timer
                      8: ** built into Intel-class processors.
                      9: **
                     10: ** To compile this program, first compile the SQLite library separately
                     11: ** will full optimizations.  For example:
                     12: **
                     13: **     gcc -c -O6 -DSQLITE_THREADSAFE=0 sqlite3.c
                     14: **
                     15: ** Then link against this program.  But to do optimize this program
                     16: ** because that defeats the hi-res timer.
                     17: **
                     18: **     gcc speedtest16.c sqlite3.o -ldl -I../src
                     19: **
                     20: ** Then run this program with a single argument which is the name of
                     21: ** a file containing SQL script that you want to test:
                     22: **
                     23: **     ./a.out database.db test.sql
                     24: */
                     25: #include <stdio.h>
                     26: #include <string.h>
                     27: #include <stdlib.h>
                     28: #include <ctype.h>
                     29: #include <unistd.h>
                     30: #include "sqlite3.h"
                     31: 
                     32: /* 
                     33: ** hwtime.h contains inline assembler code for implementing 
                     34: ** high-performance timing routines.
                     35: */
                     36: #include "hwtime.h"
                     37: 
                     38: /*
                     39: ** Convert a zero-terminated ASCII string into a zero-terminated
                     40: ** UTF-16le string.  Memory to hold the returned string comes 
                     41: ** from malloc() and should be freed by the caller.
                     42: */
                     43: static void *asciiToUtf16le(const char *z){
                     44:   int n = strlen(z);
                     45:   char *z16;
                     46:   int i, j;
                     47: 
                     48:   z16 = malloc( n*2 + 2 );
                     49:   for(i=j=0; i<=n; i++){
                     50:     z16[j++] = z[i];
                     51:     z16[j++] = 0;
                     52:   }
                     53:   return (void*)z16;
                     54: }
                     55: 
                     56: /*
                     57: ** Timers
                     58: */
                     59: static sqlite_uint64 prepTime = 0;
                     60: static sqlite_uint64 runTime = 0;
                     61: static sqlite_uint64 finalizeTime = 0;
                     62: 
                     63: /*
                     64: ** Prepare and run a single statement of SQL.
                     65: */
                     66: static void prepareAndRun(sqlite3 *db, const char *zSql){
                     67:   void *utf16;
                     68:   sqlite3_stmt *pStmt;
                     69:   const void *stmtTail;
                     70:   sqlite_uint64 iStart, iElapse;
                     71:   int rc;
                     72:   
                     73:   printf("****************************************************************\n");
                     74:   printf("SQL statement: [%s]\n", zSql);
                     75:   utf16 = asciiToUtf16le(zSql);
                     76:   iStart = sqlite3Hwtime();
                     77:   rc = sqlite3_prepare16_v2(db, utf16, -1, &pStmt, &stmtTail);
                     78:   iElapse = sqlite3Hwtime() - iStart;
                     79:   prepTime += iElapse;
                     80:   printf("sqlite3_prepare16_v2() returns %d in %llu cycles\n", rc, iElapse);
                     81:   if( rc==SQLITE_OK ){
                     82:     int nRow = 0;
                     83:     iStart = sqlite3Hwtime();
                     84:     while( (rc=sqlite3_step(pStmt))==SQLITE_ROW ){ nRow++; }
                     85:     iElapse = sqlite3Hwtime() - iStart;
                     86:     runTime += iElapse;
                     87:     printf("sqlite3_step() returns %d after %d rows in %llu cycles\n",
                     88:            rc, nRow, iElapse);
                     89:     iStart = sqlite3Hwtime();
                     90:     rc = sqlite3_finalize(pStmt);
                     91:     iElapse = sqlite3Hwtime() - iStart;
                     92:     finalizeTime += iElapse;
                     93:     printf("sqlite3_finalize() returns %d in %llu cycles\n", rc, iElapse);
                     94:   }
                     95:   free(utf16);
                     96: }
                     97: 
                     98: int main(int argc, char **argv){
                     99:   void *utf16;
                    100:   sqlite3 *db;
                    101:   int rc;
                    102:   int nSql;
                    103:   char *zSql;
                    104:   int i, j;
                    105:   FILE *in;
                    106:   sqlite_uint64 iStart, iElapse;
                    107:   sqlite_uint64 iSetup = 0;
                    108:   int nStmt = 0;
                    109:   int nByte = 0;
                    110: 
                    111:   if( argc!=3 ){
                    112:     fprintf(stderr, "Usage: %s FILENAME SQL-SCRIPT\n"
                    113:                     "Runs SQL-SCRIPT as UTF16 against a UTF16 database\n",
                    114:                     argv[0]);
                    115:     exit(1);
                    116:   }
                    117:   in = fopen(argv[2], "r");
                    118:   fseek(in, 0L, SEEK_END);
                    119:   nSql = ftell(in);
                    120:   zSql = malloc( nSql+1 );
                    121:   fseek(in, 0L, SEEK_SET);
                    122:   nSql = fread(zSql, 1, nSql, in);
                    123:   zSql[nSql] = 0;
                    124: 
                    125:   printf("SQLite version: %d\n", sqlite3_libversion_number());
                    126:   unlink(argv[1]);
                    127:   utf16 = asciiToUtf16le(argv[1]);
                    128:   iStart = sqlite3Hwtime();
                    129:   rc = sqlite3_open16(utf16, &db);
                    130:   iElapse = sqlite3Hwtime() - iStart;
                    131:   iSetup = iElapse;
                    132:   printf("sqlite3_open16() returns %d in %llu cycles\n", rc, iElapse);
                    133:   free(utf16);
                    134:   for(i=j=0; j<nSql; j++){
                    135:     if( zSql[j]==';' ){
                    136:       int isComplete;
                    137:       char c = zSql[j+1];
                    138:       zSql[j+1] = 0;
                    139:       isComplete = sqlite3_complete(&zSql[i]);
                    140:       zSql[j+1] = c;
                    141:       if( isComplete ){
                    142:         zSql[j] = 0;
                    143:         while( i<j && isspace(zSql[i]) ){ i++; }
                    144:         if( i<j ){
                    145:           nStmt++;
                    146:           nByte += j-i;
                    147:           prepareAndRun(db, &zSql[i]);
                    148:         }
                    149:         zSql[j] = ';';
                    150:         i = j+1;
                    151:       }
                    152:     }
                    153:   }
                    154:   iStart = sqlite3Hwtime();
                    155:   sqlite3_close(db);
                    156:   iElapse = sqlite3Hwtime() - iStart;
                    157:   iSetup += iElapse;
                    158:   printf("sqlite3_close() returns in %llu cycles\n", iElapse);
                    159:   printf("\n");
                    160:   printf("Statements run:       %15d\n", nStmt);
                    161:   printf("Bytes of SQL text:    %15d\n", nByte);
                    162:   printf("Total prepare time:   %15llu cycles\n", prepTime);
                    163:   printf("Total run time:       %15llu cycles\n", runTime);
                    164:   printf("Total finalize time:  %15llu cycles\n", finalizeTime);
                    165:   printf("Open/Close time:      %15llu cycles\n", iSetup);
                    166:   printf("Total Time:           %15llu cycles\n",
                    167:       prepTime + runTime + finalizeTime + iSetup);
                    168:   return 0;
                    169: }

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>