2 ** Performance test for SQLite.
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.
9 ** To compile this program, first compile the SQLite library separately
10 ** will full optimizations. For example:
12 ** gcc -c -O6 -DSQLITE_THREADSAFE=0 sqlite3.c
14 ** Then link against this program. But to do optimize this program
15 ** because that defeats the hi-res timer.
17 ** gcc speedtest8.c sqlite3.o -ldl -I../src
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:
22 ** ./a.out test.db test.sql
32 #define ISSPACE(X) isspace((unsigned char)(X))
34 #include "test_osinst.c"
37 ** Prepare and run a single statement of SQL.
39 static void prepareAndRun(sqlite3_vfs
*pInstVfs
, sqlite3
*db
, const char *zSql
){
44 zMessage
[1023] = '\0';
48 sqlite3_snprintf(1023, zMessage
, "sqlite3_prepare_v2: %s", zSql
);
49 sqlite3_instvfs_binarylog_marker(pInstVfs
, zMessage
);
51 iTime
= sqlite3Hwtime();
52 rc
= sqlite3_prepare_v2(db
, zSql
, -1, &pStmt
, &stmtTail
);
53 iTime
= sqlite3Hwtime() - iTime
;
54 sqlite3_instvfs_binarylog_call(pInstVfs
,BINARYLOG_PREPARE_V2
,iTime
,rc
,zSql
);
59 sqlite3_snprintf(1023, zMessage
, "sqlite3_step loop: %s", zSql
);
60 sqlite3_instvfs_binarylog_marker(pInstVfs
, zMessage
);
61 iTime
= sqlite3Hwtime();
62 while( (rc
=sqlite3_step(pStmt
))==SQLITE_ROW
){ nRow
++; }
63 iTime
= sqlite3Hwtime() - iTime
;
64 sqlite3_instvfs_binarylog_call(pInstVfs
, BINARYLOG_STEP
, iTime
, rc
, zSql
);
66 sqlite3_snprintf(1023, zMessage
, "sqlite3_finalize: %s", zSql
);
67 sqlite3_instvfs_binarylog_marker(pInstVfs
, zMessage
);
68 iTime
= sqlite3Hwtime();
69 rc
= sqlite3_finalize(pStmt
);
70 iTime
= sqlite3Hwtime() - iTime
;
71 sqlite3_instvfs_binarylog_call(pInstVfs
, BINARYLOG_FINALIZE
, iTime
, rc
, zSql
);
75 static int stringcompare(const char *zLeft
, const char *zRight
){
77 for(ii
=0; zLeft
[ii
] && zRight
[ii
]; ii
++){
78 if( zLeft
[ii
]!=zRight
[ii
] ) return 0;
80 return( zLeft
[ii
]==zRight
[ii
] );
83 static char *readScriptFile(const char *zFile
, int *pnScript
){
84 sqlite3_vfs
*pVfs
= sqlite3_vfs_find(0);
89 int flags
= SQLITE_OPEN_READONLY
|SQLITE_OPEN_MAIN_DB
;
91 p
= (sqlite3_file
*)malloc(pVfs
->szOsFile
);
92 rc
= pVfs
->xOpen(pVfs
, zFile
, p
, flags
, &flags
);
97 rc
= p
->pMethods
->xFileSize(p
, &nByte
);
102 zData
= (char *)malloc(nByte
+1);
103 rc
= p
->pMethods
->xRead(p
, zData
, nByte
, 0);
109 p
->pMethods
->xClose(p
);
115 p
->pMethods
->xClose(p
);
123 int main(int argc
, char **argv
){
125 const char zUsageMsg
[] =
126 "Usage: %s options...\n"
127 " where available options are:\n"
129 " -db DATABASE-FILE (database file to operate on)\n"
130 " -script SCRIPT-FILE (script file to read sql from)\n"
131 " -log LOG-FILE (log file to create)\n"
132 " -logdata (log all data to log file)\n"
134 " Options -db, -script and -log are compulsory\n"
139 const char *zScript
= 0;
140 const char *zLog
= 0;
147 sqlite3_vfs
*pInstVfs
; /* Instrumentation VFS */
154 for(ii
=1; ii
<argc
; ii
++){
155 if( stringcompare("-db", argv
[ii
]) && (ii
+1)<argc
){
159 else if( stringcompare("-script", argv
[ii
]) && (ii
+1)<argc
){
160 zScript
= argv
[++ii
];
163 else if( stringcompare("-log", argv
[ii
]) && (ii
+1)<argc
){
167 else if( stringcompare("-logdata", argv
[ii
]) ){
175 if( !zDb
|| !zScript
|| !zLog
) goto usage
;
177 zSql
= readScriptFile(zScript
, &nSql
);
179 fprintf(stderr
, "Failed to read script file\n");
183 pInstVfs
= sqlite3_instvfs_binarylog("logging", 0, zLog
, logdata
);
185 rc
= sqlite3_open_v2(
186 zDb
, &db
, SQLITE_OPEN_READWRITE
| SQLITE_OPEN_CREATE
, "logging"
189 fprintf(stderr
, "Failed to open db: %s\n", sqlite3_errmsg(db
));
193 for(i
=j
=0; j
<nSql
; j
++){
198 isComplete
= sqlite3_complete(&zSql
[i
]);
202 while( i
<j
&& ISSPACE(zSql
[i
]) ){ i
++; }
204 prepareAndRun(pInstVfs
, db
, &zSql
[i
]);
212 sqlite3_instvfs_destroy(pInstVfs
);
216 fprintf(stderr
, zUsageMsg
, argv
[0]);