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 #include "test_osinst.c"
35 ** Prepare and run a single statement of SQL.
37 static void prepareAndRun(sqlite3_vfs
*pInstVfs
, sqlite3
*db
, const char *zSql
){
42 zMessage
[1023] = '\0';
46 sqlite3_snprintf(1023, zMessage
, "sqlite3_prepare_v2: %s", zSql
);
47 sqlite3_instvfs_binarylog_marker(pInstVfs
, zMessage
);
49 iTime
= sqlite3Hwtime();
50 rc
= sqlite3_prepare_v2(db
, zSql
, -1, &pStmt
, &stmtTail
);
51 iTime
= sqlite3Hwtime() - iTime
;
52 sqlite3_instvfs_binarylog_call(pInstVfs
,BINARYLOG_PREPARE_V2
,iTime
,rc
,zSql
);
57 sqlite3_snprintf(1023, zMessage
, "sqlite3_step loop: %s", zSql
);
58 sqlite3_instvfs_binarylog_marker(pInstVfs
, zMessage
);
59 iTime
= sqlite3Hwtime();
60 while( (rc
=sqlite3_step(pStmt
))==SQLITE_ROW
){ nRow
++; }
61 iTime
= sqlite3Hwtime() - iTime
;
62 sqlite3_instvfs_binarylog_call(pInstVfs
, BINARYLOG_STEP
, iTime
, rc
, zSql
);
64 sqlite3_snprintf(1023, zMessage
, "sqlite3_finalize: %s", zSql
);
65 sqlite3_instvfs_binarylog_marker(pInstVfs
, zMessage
);
66 iTime
= sqlite3Hwtime();
67 rc
= sqlite3_finalize(pStmt
);
68 iTime
= sqlite3Hwtime() - iTime
;
69 sqlite3_instvfs_binarylog_call(pInstVfs
, BINARYLOG_FINALIZE
, iTime
, rc
, zSql
);
73 static int stringcompare(const char *zLeft
, const char *zRight
){
75 for(ii
=0; zLeft
[ii
] && zRight
[ii
]; ii
++){
76 if( zLeft
[ii
]!=zRight
[ii
] ) return 0;
78 return( zLeft
[ii
]==zRight
[ii
] );
81 static char *readScriptFile(const char *zFile
, int *pnScript
){
82 sqlite3_vfs
*pVfs
= sqlite3_vfs_find(0);
87 int flags
= SQLITE_OPEN_READONLY
|SQLITE_OPEN_MAIN_DB
;
89 p
= (sqlite3_file
*)malloc(pVfs
->szOsFile
);
90 rc
= pVfs
->xOpen(pVfs
, zFile
, p
, flags
, &flags
);
95 rc
= p
->pMethods
->xFileSize(p
, &nByte
);
100 zData
= (char *)malloc(nByte
+1);
101 rc
= p
->pMethods
->xRead(p
, zData
, nByte
, 0);
107 p
->pMethods
->xClose(p
);
113 p
->pMethods
->xClose(p
);
121 int main(int argc
, char **argv
){
123 const char zUsageMsg
[] =
124 "Usage: %s options...\n"
125 " where available options are:\n"
127 " -db DATABASE-FILE (database file to operate on)\n"
128 " -script SCRIPT-FILE (script file to read sql from)\n"
129 " -log LOG-FILE (log file to create)\n"
130 " -logdata (log all data to log file)\n"
132 " Options -db, -script and -log are compulsory\n"
137 const char *zScript
= 0;
138 const char *zLog
= 0;
145 sqlite3_vfs
*pInstVfs
; /* Instrumentation VFS */
152 for(ii
=1; ii
<argc
; ii
++){
153 if( stringcompare("-db", argv
[ii
]) && (ii
+1)<argc
){
157 else if( stringcompare("-script", argv
[ii
]) && (ii
+1)<argc
){
158 zScript
= argv
[++ii
];
161 else if( stringcompare("-log", argv
[ii
]) && (ii
+1)<argc
){
165 else if( stringcompare("-logdata", argv
[ii
]) ){
173 if( !zDb
|| !zScript
|| !zLog
) goto usage
;
175 zSql
= readScriptFile(zScript
, &nSql
);
177 fprintf(stderr
, "Failed to read script file\n");
181 pInstVfs
= sqlite3_instvfs_binarylog("logging", 0, zLog
, logdata
);
183 rc
= sqlite3_open_v2(
184 zDb
, &db
, SQLITE_OPEN_READWRITE
| SQLITE_OPEN_CREATE
, "logging"
187 fprintf(stderr
, "Failed to open db: %s\n", sqlite3_errmsg(db
));
191 for(i
=j
=0; j
<nSql
; j
++){
196 isComplete
= sqlite3_complete(&zSql
[i
]);
200 while( i
<j
&& isspace(zSql
[i
]) ){ i
++; }
202 prepareAndRun(pInstVfs
, db
, &zSql
[i
]);
210 sqlite3_instvfs_destroy(pInstVfs
);
214 fprintf(stderr
, zUsageMsg
, argv
[0]);