speedtest16.c

来自「最新的sqlite3.6.2源代码」· C语言 代码 · 共 170 行

C
170
字号
/*** Performance test for SQLite.**** This program reads ASCII text from a file named on the command-line.** It converts each SQL statement into UTF16 and submits it to SQLite** for evaluation.  A new UTF16 database is created at the beginning of** the program.  All statements are timed using the high-resolution timer** built into Intel-class processors.**** To compile this program, first compile the SQLite library separately** will full optimizations.  For example:****     gcc -c -O6 -DSQLITE_THREADSAFE=0 sqlite3.c**** Then link against this program.  But to do optimize this program** because that defeats the hi-res timer.****     gcc speedtest16.c sqlite3.o -ldl -I../src**** Then run this program with a single argument which is the name of** a file containing SQL script that you want to test:****     ./a.out database.db test.sql*/#include <stdio.h>#include <string.h>#include <stdlib.h>#include <ctype.h>#include <unistd.h>#include "sqlite3.h"/* ** hwtime.h contains inline assembler code for implementing ** high-performance timing routines.*/#include "hwtime.h"/*** Convert a zero-terminated ASCII string into a zero-terminated** UTF-16le string.  Memory to hold the returned string comes ** from malloc() and should be freed by the caller.*/static void *asciiToUtf16le(const char *z){  int n = strlen(z);  char *z16;  int i, j;  z16 = malloc( n*2 + 2 );  for(i=j=0; i<=n; i++){    z16[j++] = z[i];    z16[j++] = 0;  }  return (void*)z16;}/*** Timers*/static sqlite_uint64 prepTime = 0;static sqlite_uint64 runTime = 0;static sqlite_uint64 finalizeTime = 0;/*** Prepare and run a single statement of SQL.*/static void prepareAndRun(sqlite3 *db, const char *zSql){  void *utf16;  sqlite3_stmt *pStmt;  const void *stmtTail;  sqlite_uint64 iStart, iElapse;  int rc;    printf("****************************************************************\n");  printf("SQL statement: [%s]\n", zSql);  utf16 = asciiToUtf16le(zSql);  iStart = sqlite3Hwtime();  rc = sqlite3_prepare16_v2(db, utf16, -1, &pStmt, &stmtTail);  iElapse = sqlite3Hwtime() - iStart;  prepTime += iElapse;  printf("sqlite3_prepare16_v2() returns %d in %llu cycles\n", rc, iElapse);  if( rc==SQLITE_OK ){    int nRow = 0;    iStart = sqlite3Hwtime();    while( (rc=sqlite3_step(pStmt))==SQLITE_ROW ){ nRow++; }    iElapse = sqlite3Hwtime() - iStart;    runTime += iElapse;    printf("sqlite3_step() returns %d after %d rows in %llu cycles\n",           rc, nRow, iElapse);    iStart = sqlite3Hwtime();    rc = sqlite3_finalize(pStmt);    iElapse = sqlite3Hwtime() - iStart;    finalizeTime += iElapse;    printf("sqlite3_finalize() returns %d in %llu cycles\n", rc, iElapse);  }  free(utf16);}int main(int argc, char **argv){  void *utf16;  sqlite3 *db;  int rc;  int nSql;  char *zSql;  int i, j;  FILE *in;  sqlite_uint64 iStart, iElapse;  sqlite_uint64 iSetup = 0;  int nStmt = 0;  int nByte = 0;  if( argc!=3 ){    fprintf(stderr, "Usage: %s FILENAME SQL-SCRIPT\n"                    "Runs SQL-SCRIPT as UTF16 against a UTF16 database\n",                    argv[0]);    exit(1);  }  in = fopen(argv[2], "r");  fseek(in, 0L, SEEK_END);  nSql = ftell(in);  zSql = malloc( nSql+1 );  fseek(in, 0L, SEEK_SET);  nSql = fread(zSql, 1, nSql, in);  zSql[nSql] = 0;  printf("SQLite version: %d\n", sqlite3_libversion_number());  unlink(argv[1]);  utf16 = asciiToUtf16le(argv[1]);  iStart = sqlite3Hwtime();  rc = sqlite3_open16(utf16, &db);  iElapse = sqlite3Hwtime() - iStart;  iSetup = iElapse;  printf("sqlite3_open16() returns %d in %llu cycles\n", rc, iElapse);  free(utf16);  for(i=j=0; j<nSql; j++){    if( zSql[j]==';' ){      int isComplete;      char c = zSql[j+1];      zSql[j+1] = 0;      isComplete = sqlite3_complete(&zSql[i]);      zSql[j+1] = c;      if( isComplete ){        zSql[j] = 0;        while( i<j && isspace(zSql[i]) ){ i++; }        if( i<j ){          nStmt++;          nByte += j-i;          prepareAndRun(db, &zSql[i]);        }        zSql[j] = ';';        i = j+1;      }    }  }  iStart = sqlite3Hwtime();  sqlite3_close(db);  iElapse = sqlite3Hwtime() - iStart;  iSetup += iElapse;  printf("sqlite3_close() returns in %llu cycles\n", iElapse);  printf("\n");  printf("Statements run:       %15d\n", nStmt);  printf("Bytes of SQL text:    %15d\n", nByte);  printf("Total prepare time:   %15llu cycles\n", prepTime);  printf("Total run time:       %15llu cycles\n", runTime);  printf("Total finalize time:  %15llu cycles\n", finalizeTime);  printf("Open/Close time:      %15llu cycles\n", iSetup);  printf("Total Time:           %15llu cycles\n",      prepTime + runTime + finalizeTime + iSetup);  return 0;}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?