/ Hex Artifact Content
Login

Artifact ecb6542862151c3e6509bbc00509b234562ae81e:


0000: 2f 2a 0a 2a 2a 20 50 65 72 66 6f 72 6d 61 6e 63  /*.** Performanc
0010: 65 20 74 65 73 74 20 66 6f 72 20 53 51 4c 69 74  e test for SQLit
0020: 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 70 72  e..**.** This pr
0030: 6f 67 72 61 6d 20 72 65 61 64 73 20 41 53 43 49  ogram reads ASCI
0040: 49 20 74 65 78 74 20 66 72 6f 6d 20 61 20 66 69  I text from a fi
0050: 6c 65 20 6e 61 6d 65 64 20 6f 6e 20 74 68 65 20  le named on the 
0060: 63 6f 6d 6d 61 6e 64 2d 6c 69 6e 65 2e 0a 2a 2a  command-line..**
0070: 20 49 74 20 63 6f 6e 76 65 72 74 73 20 65 61 63   It converts eac
0080: 68 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20  h SQL statement 
0090: 69 6e 74 6f 20 55 54 46 31 36 20 61 6e 64 20 73  into UTF16 and s
00a0: 75 62 6d 69 74 73 20 69 74 20 74 6f 20 53 51 4c  ubmits it to SQL
00b0: 69 74 65 0a 2a 2a 20 66 6f 72 20 65 76 61 6c 75  ite.** for evalu
00c0: 61 74 69 6f 6e 2e 20 20 41 20 6e 65 77 20 55 54  ation.  A new UT
00d0: 46 31 36 20 64 61 74 61 62 61 73 65 20 69 73 20  F16 database is 
00e0: 63 72 65 61 74 65 64 20 61 74 20 74 68 65 20 62  created at the b
00f0: 65 67 69 6e 6e 69 6e 67 20 6f 66 0a 2a 2a 20 74  eginning of.** t
0100: 68 65 20 70 72 6f 67 72 61 6d 2e 20 20 41 6c 6c  he program.  All
0110: 20 73 74 61 74 65 6d 65 6e 74 73 20 61 72 65 20   statements are 
0120: 74 69 6d 65 64 20 75 73 69 6e 67 20 74 68 65 20  timed using the 
0130: 68 69 67 68 2d 72 65 73 6f 6c 75 74 69 6f 6e 20  high-resolution 
0140: 74 69 6d 65 72 0a 2a 2a 20 62 75 69 6c 74 20 69  timer.** built i
0150: 6e 74 6f 20 49 6e 74 65 6c 2d 63 6c 61 73 73 20  nto Intel-class 
0160: 70 72 6f 63 65 73 73 6f 72 73 2e 0a 2a 2a 0a 2a  processors..**.*
0170: 2a 20 54 6f 20 63 6f 6d 70 69 6c 65 20 74 68 69  * To compile thi
0180: 73 20 70 72 6f 67 72 61 6d 2c 20 66 69 72 73 74  s program, first
0190: 20 63 6f 6d 70 69 6c 65 20 74 68 65 20 53 51 4c   compile the SQL
01a0: 69 74 65 20 6c 69 62 72 61 72 79 20 73 65 70 61  ite library sepa
01b0: 72 61 74 65 6c 79 0a 2a 2a 20 77 69 6c 6c 20 66  rately.** will f
01c0: 75 6c 6c 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  ull optimization
01d0: 73 2e 20 20 46 6f 72 20 65 78 61 6d 70 6c 65 3a  s.  For example:
01e0: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 67 63 63 20 2d  .**.**     gcc -
01f0: 63 20 2d 4f 36 20 2d 44 53 51 4c 49 54 45 5f 54  c -O6 -DSQLITE_T
0200: 48 52 45 41 44 53 41 46 45 3d 30 20 73 71 6c 69  HREADSAFE=0 sqli
0210: 74 65 33 2e 63 0a 2a 2a 0a 2a 2a 20 54 68 65 6e  te3.c.**.** Then
0220: 20 6c 69 6e 6b 20 61 67 61 69 6e 73 74 20 74 68   link against th
0230: 69 73 20 70 72 6f 67 72 61 6d 2e 20 20 42 75 74  is program.  But
0240: 20 74 6f 20 64 6f 20 6f 70 74 69 6d 69 7a 65 20   to do optimize 
0250: 74 68 69 73 20 70 72 6f 67 72 61 6d 0a 2a 2a 20  this program.** 
0260: 62 65 63 61 75 73 65 20 74 68 61 74 20 64 65 66  because that def
0270: 65 61 74 73 20 74 68 65 20 68 69 2d 72 65 73 20  eats the hi-res 
0280: 74 69 6d 65 72 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  timer..**.**    
0290: 20 67 63 63 20 73 70 65 65 64 74 65 73 74 31 36   gcc speedtest16
02a0: 2e 63 20 73 71 6c 69 74 65 33 2e 6f 20 2d 6c 64  .c sqlite3.o -ld
02b0: 6c 20 2d 49 2e 2e 2f 73 72 63 0a 2a 2a 0a 2a 2a  l -I../src.**.**
02c0: 20 54 68 65 6e 20 72 75 6e 20 74 68 69 73 20 70   Then run this p
02d0: 72 6f 67 72 61 6d 20 77 69 74 68 20 61 20 73 69  rogram with a si
02e0: 6e 67 6c 65 20 61 72 67 75 6d 65 6e 74 20 77 68  ngle argument wh
02f0: 69 63 68 20 69 73 20 74 68 65 20 6e 61 6d 65 20  ich is the name 
0300: 6f 66 0a 2a 2a 20 61 20 66 69 6c 65 20 63 6f 6e  of.** a file con
0310: 74 61 69 6e 69 6e 67 20 53 51 4c 20 73 63 72 69  taining SQL scri
0320: 70 74 20 74 68 61 74 20 79 6f 75 20 77 61 6e 74  pt that you want
0330: 20 74 6f 20 74 65 73 74 3a 0a 2a 2a 0a 2a 2a 20   to test:.**.** 
0340: 20 20 20 20 2e 2f 61 2e 6f 75 74 20 64 61 74 61      ./a.out data
0350: 62 61 73 65 2e 64 62 20 74 65 73 74 2e 73 71 6c  base.db test.sql
0360: 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 3c 73 74  .*/.#include <st
0370: 64 69 6f 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20  dio.h>.#include 
0380: 3c 73 74 72 69 6e 67 2e 68 3e 0a 23 69 6e 63 6c  <string.h>.#incl
0390: 75 64 65 20 3c 73 74 64 6c 69 62 2e 68 3e 0a 23  ude <stdlib.h>.#
03a0: 69 6e 63 6c 75 64 65 20 3c 63 74 79 70 65 2e 68  include <ctype.h
03b0: 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 75 6e 69 73  >.#include <unis
03c0: 74 64 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 22  td.h>.#include "
03d0: 73 71 6c 69 74 65 33 2e 68 22 0a 0a 23 64 65 66  sqlite3.h"..#def
03e0: 69 6e 65 20 49 53 53 50 41 43 45 28 58 29 20 20  ine ISSPACE(X)  
03f0: 69 73 73 70 61 63 65 28 28 75 6e 73 69 67 6e 65  isspace((unsigne
0400: 64 20 63 68 61 72 29 28 58 29 29 0a 0a 2f 2a 20  d char)(X))../* 
0410: 0a 2a 2a 20 68 77 74 69 6d 65 2e 68 20 63 6f 6e  .** hwtime.h con
0420: 74 61 69 6e 73 20 69 6e 6c 69 6e 65 20 61 73 73  tains inline ass
0430: 65 6d 62 6c 65 72 20 63 6f 64 65 20 66 6f 72 20  embler code for 
0440: 69 6d 70 6c 65 6d 65 6e 74 69 6e 67 20 0a 2a 2a  implementing .**
0450: 20 68 69 67 68 2d 70 65 72 66 6f 72 6d 61 6e 63   high-performanc
0460: 65 20 74 69 6d 69 6e 67 20 72 6f 75 74 69 6e 65  e timing routine
0470: 73 2e 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 22  s..*/.#include "
0480: 68 77 74 69 6d 65 2e 68 22 0a 0a 2f 2a 0a 2a 2a  hwtime.h"../*.**
0490: 20 43 6f 6e 76 65 72 74 20 61 20 7a 65 72 6f 2d   Convert a zero-
04a0: 74 65 72 6d 69 6e 61 74 65 64 20 41 53 43 49 49  terminated ASCII
04b0: 20 73 74 72 69 6e 67 20 69 6e 74 6f 20 61 20 7a   string into a z
04c0: 65 72 6f 2d 74 65 72 6d 69 6e 61 74 65 64 0a 2a  ero-terminated.*
04d0: 2a 20 55 54 46 2d 31 36 6c 65 20 73 74 72 69 6e  * UTF-16le strin
04e0: 67 2e 20 20 4d 65 6d 6f 72 79 20 74 6f 20 68 6f  g.  Memory to ho
04f0: 6c 64 20 74 68 65 20 72 65 74 75 72 6e 65 64 20  ld the returned 
0500: 73 74 72 69 6e 67 20 63 6f 6d 65 73 20 0a 2a 2a  string comes .**
0510: 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63 28 29 20 61   from malloc() a
0520: 6e 64 20 73 68 6f 75 6c 64 20 62 65 20 66 72 65  nd should be fre
0530: 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72  ed by the caller
0540: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
0550: 20 2a 61 73 63 69 69 54 6f 55 74 66 31 36 6c 65   *asciiToUtf16le
0560: 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 29 7b  (const char *z){
0570: 0a 20 20 69 6e 74 20 6e 20 3d 20 73 74 72 6c 65  .  int n = strle
0580: 6e 28 7a 29 3b 0a 20 20 63 68 61 72 20 2a 7a 31  n(z);.  char *z1
0590: 36 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 0a  6;.  int i, j;..
05a0: 20 20 7a 31 36 20 3d 20 6d 61 6c 6c 6f 63 28 20    z16 = malloc( 
05b0: 6e 2a 32 20 2b 20 32 20 29 3b 0a 20 20 66 6f 72  n*2 + 2 );.  for
05c0: 28 69 3d 6a 3d 30 3b 20 69 3c 3d 6e 3b 20 69 2b  (i=j=0; i<=n; i+
05d0: 2b 29 7b 0a 20 20 20 20 7a 31 36 5b 6a 2b 2b 5d  +){.    z16[j++]
05e0: 20 3d 20 7a 5b 69 5d 3b 0a 20 20 20 20 7a 31 36   = z[i];.    z16
05f0: 5b 6a 2b 2b 5d 20 3d 20 30 3b 0a 20 20 7d 0a 20  [j++] = 0;.  }. 
0600: 20 72 65 74 75 72 6e 20 28 76 6f 69 64 2a 29 7a   return (void*)z
0610: 31 36 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 69 6d  16;.}../*.** Tim
0620: 65 72 73 0a 2a 2f 0a 73 74 61 74 69 63 20 73 71  ers.*/.static sq
0630: 6c 69 74 65 5f 75 69 6e 74 36 34 20 70 72 65 70  lite_uint64 prep
0640: 54 69 6d 65 20 3d 20 30 3b 0a 73 74 61 74 69 63  Time = 0;.static
0650: 20 73 71 6c 69 74 65 5f 75 69 6e 74 36 34 20 72   sqlite_uint64 r
0660: 75 6e 54 69 6d 65 20 3d 20 30 3b 0a 73 74 61 74  unTime = 0;.stat
0670: 69 63 20 73 71 6c 69 74 65 5f 75 69 6e 74 36 34  ic sqlite_uint64
0680: 20 66 69 6e 61 6c 69 7a 65 54 69 6d 65 20 3d 20   finalizeTime = 
0690: 30 3b 0a 0a 2f 2a 0a 2a 2a 20 50 72 65 70 61 72  0;../*.** Prepar
06a0: 65 20 61 6e 64 20 72 75 6e 20 61 20 73 69 6e 67  e and run a sing
06b0: 6c 65 20 73 74 61 74 65 6d 65 6e 74 20 6f 66 20  le statement of 
06c0: 53 51 4c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  SQL..*/.static v
06d0: 6f 69 64 20 70 72 65 70 61 72 65 41 6e 64 52 75  oid prepareAndRu
06e0: 6e 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 63  n(sqlite3 *db, c
06f0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 71 6c 29  onst char *zSql)
0700: 7b 0a 20 20 76 6f 69 64 20 2a 75 74 66 31 36 3b  {.  void *utf16;
0710: 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20  .  sqlite3_stmt 
0720: 2a 70 53 74 6d 74 3b 0a 20 20 63 6f 6e 73 74 20  *pStmt;.  const 
0730: 76 6f 69 64 20 2a 73 74 6d 74 54 61 69 6c 3b 0a  void *stmtTail;.
0740: 20 20 73 71 6c 69 74 65 5f 75 69 6e 74 36 34 20    sqlite_uint64 
0750: 69 53 74 61 72 74 2c 20 69 45 6c 61 70 73 65 3b  iStart, iElapse;
0760: 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 0a 20 20  .  int rc;.  .  
0770: 70 72 69 6e 74 66 28 22 2a 2a 2a 2a 2a 2a 2a 2a  printf("********
0780: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0790: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
07a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
07b0: 2a 2a 2a 2a 2a 2a 2a 2a 5c 6e 22 29 3b 0a 20 20  ********\n");.  
07c0: 70 72 69 6e 74 66 28 22 53 51 4c 20 73 74 61 74  printf("SQL stat
07d0: 65 6d 65 6e 74 3a 20 5b 25 73 5d 5c 6e 22 2c 20  ement: [%s]\n", 
07e0: 7a 53 71 6c 29 3b 0a 20 20 75 74 66 31 36 20 3d  zSql);.  utf16 =
07f0: 20 61 73 63 69 69 54 6f 55 74 66 31 36 6c 65 28   asciiToUtf16le(
0800: 7a 53 71 6c 29 3b 0a 20 20 69 53 74 61 72 74 20  zSql);.  iStart 
0810: 3d 20 73 71 6c 69 74 65 33 48 77 74 69 6d 65 28  = sqlite3Hwtime(
0820: 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
0830: 33 5f 70 72 65 70 61 72 65 31 36 5f 76 32 28 64  3_prepare16_v2(d
0840: 62 2c 20 75 74 66 31 36 2c 20 2d 31 2c 20 26 70  b, utf16, -1, &p
0850: 53 74 6d 74 2c 20 26 73 74 6d 74 54 61 69 6c 29  Stmt, &stmtTail)
0860: 3b 0a 20 20 69 45 6c 61 70 73 65 20 3d 20 73 71  ;.  iElapse = sq
0870: 6c 69 74 65 33 48 77 74 69 6d 65 28 29 20 2d 20  lite3Hwtime() - 
0880: 69 53 74 61 72 74 3b 0a 20 20 70 72 65 70 54 69  iStart;.  prepTi
0890: 6d 65 20 2b 3d 20 69 45 6c 61 70 73 65 3b 0a 20  me += iElapse;. 
08a0: 20 70 72 69 6e 74 66 28 22 73 71 6c 69 74 65 33   printf("sqlite3
08b0: 5f 70 72 65 70 61 72 65 31 36 5f 76 32 28 29 20  _prepare16_v2() 
08c0: 72 65 74 75 72 6e 73 20 25 64 20 69 6e 20 25 6c  returns %d in %l
08d0: 6c 75 20 63 79 63 6c 65 73 5c 6e 22 2c 20 72 63  lu cycles\n", rc
08e0: 2c 20 69 45 6c 61 70 73 65 29 3b 0a 20 20 69 66  , iElapse);.  if
08f0: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
0900: 29 7b 0a 20 20 20 20 69 6e 74 20 6e 52 6f 77 20  ){.    int nRow 
0910: 3d 20 30 3b 0a 20 20 20 20 69 53 74 61 72 74 20  = 0;.    iStart 
0920: 3d 20 73 71 6c 69 74 65 33 48 77 74 69 6d 65 28  = sqlite3Hwtime(
0930: 29 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 28 72  );.    while( (r
0940: 63 3d 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70  c=sqlite3_step(p
0950: 53 74 6d 74 29 29 3d 3d 53 51 4c 49 54 45 5f 52  Stmt))==SQLITE_R
0960: 4f 57 20 29 7b 20 6e 52 6f 77 2b 2b 3b 20 7d 0a  OW ){ nRow++; }.
0970: 20 20 20 20 69 45 6c 61 70 73 65 20 3d 20 73 71      iElapse = sq
0980: 6c 69 74 65 33 48 77 74 69 6d 65 28 29 20 2d 20  lite3Hwtime() - 
0990: 69 53 74 61 72 74 3b 0a 20 20 20 20 72 75 6e 54  iStart;.    runT
09a0: 69 6d 65 20 2b 3d 20 69 45 6c 61 70 73 65 3b 0a  ime += iElapse;.
09b0: 20 20 20 20 70 72 69 6e 74 66 28 22 73 71 6c 69      printf("sqli
09c0: 74 65 33 5f 73 74 65 70 28 29 20 72 65 74 75 72  te3_step() retur
09d0: 6e 73 20 25 64 20 61 66 74 65 72 20 25 64 20 72  ns %d after %d r
09e0: 6f 77 73 20 69 6e 20 25 6c 6c 75 20 63 79 63 6c  ows in %llu cycl
09f0: 65 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  es\n",.         
0a00: 20 20 72 63 2c 20 6e 52 6f 77 2c 20 69 45 6c 61    rc, nRow, iEla
0a10: 70 73 65 29 3b 0a 20 20 20 20 69 53 74 61 72 74  pse);.    iStart
0a20: 20 3d 20 73 71 6c 69 74 65 33 48 77 74 69 6d 65   = sqlite3Hwtime
0a30: 28 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  ();.    rc = sql
0a40: 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53  ite3_finalize(pS
0a50: 74 6d 74 29 3b 0a 20 20 20 20 69 45 6c 61 70 73  tmt);.    iElaps
0a60: 65 20 3d 20 73 71 6c 69 74 65 33 48 77 74 69 6d  e = sqlite3Hwtim
0a70: 65 28 29 20 2d 20 69 53 74 61 72 74 3b 0a 20 20  e() - iStart;.  
0a80: 20 20 66 69 6e 61 6c 69 7a 65 54 69 6d 65 20 2b    finalizeTime +
0a90: 3d 20 69 45 6c 61 70 73 65 3b 0a 20 20 20 20 70  = iElapse;.    p
0aa0: 72 69 6e 74 66 28 22 73 71 6c 69 74 65 33 5f 66  rintf("sqlite3_f
0ab0: 69 6e 61 6c 69 7a 65 28 29 20 72 65 74 75 72 6e  inalize() return
0ac0: 73 20 25 64 20 69 6e 20 25 6c 6c 75 20 63 79 63  s %d in %llu cyc
0ad0: 6c 65 73 5c 6e 22 2c 20 72 63 2c 20 69 45 6c 61  les\n", rc, iEla
0ae0: 70 73 65 29 3b 0a 20 20 7d 0a 20 20 66 72 65 65  pse);.  }.  free
0af0: 28 75 74 66 31 36 29 3b 0a 7d 0a 0a 69 6e 74 20  (utf16);.}..int 
0b00: 6d 61 69 6e 28 69 6e 74 20 61 72 67 63 2c 20 63  main(int argc, c
0b10: 68 61 72 20 2a 2a 61 72 67 76 29 7b 0a 20 20 76  har **argv){.  v
0b20: 6f 69 64 20 2a 75 74 66 31 36 3b 0a 20 20 73 71  oid *utf16;.  sq
0b30: 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 69 6e 74  lite3 *db;.  int
0b40: 20 72 63 3b 0a 20 20 69 6e 74 20 6e 53 71 6c 3b   rc;.  int nSql;
0b50: 0a 20 20 63 68 61 72 20 2a 7a 53 71 6c 3b 0a 20  .  char *zSql;. 
0b60: 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 46 49 4c   int i, j;.  FIL
0b70: 45 20 2a 69 6e 3b 0a 20 20 73 71 6c 69 74 65 5f  E *in;.  sqlite_
0b80: 75 69 6e 74 36 34 20 69 53 74 61 72 74 2c 20 69  uint64 iStart, i
0b90: 45 6c 61 70 73 65 3b 0a 20 20 73 71 6c 69 74 65  Elapse;.  sqlite
0ba0: 5f 75 69 6e 74 36 34 20 69 53 65 74 75 70 20 3d  _uint64 iSetup =
0bb0: 20 30 3b 0a 20 20 69 6e 74 20 6e 53 74 6d 74 20   0;.  int nStmt 
0bc0: 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 42 79 74 65  = 0;.  int nByte
0bd0: 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20 61 72 67   = 0;..  if( arg
0be0: 63 21 3d 33 20 29 7b 0a 20 20 20 20 66 70 72 69  c!=3 ){.    fpri
0bf0: 6e 74 66 28 73 74 64 65 72 72 2c 20 22 55 73 61  ntf(stderr, "Usa
0c00: 67 65 3a 20 25 73 20 46 49 4c 45 4e 41 4d 45 20  ge: %s FILENAME 
0c10: 53 51 4c 2d 53 43 52 49 50 54 5c 6e 22 0a 20 20  SQL-SCRIPT\n".  
0c20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0c30: 20 20 22 52 75 6e 73 20 53 51 4c 2d 53 43 52 49    "Runs SQL-SCRI
0c40: 50 54 20 61 73 20 55 54 46 31 36 20 61 67 61 69  PT as UTF16 agai
0c50: 6e 73 74 20 61 20 55 54 46 31 36 20 64 61 74 61  nst a UTF16 data
0c60: 62 61 73 65 5c 6e 22 2c 0a 20 20 20 20 20 20 20  base\n",.       
0c70: 20 20 20 20 20 20 20 20 20 20 20 20 20 61 72 67               arg
0c80: 76 5b 30 5d 29 3b 0a 20 20 20 20 65 78 69 74 28  v[0]);.    exit(
0c90: 31 29 3b 0a 20 20 7d 0a 20 20 69 6e 20 3d 20 66  1);.  }.  in = f
0ca0: 6f 70 65 6e 28 61 72 67 76 5b 32 5d 2c 20 22 72  open(argv[2], "r
0cb0: 22 29 3b 0a 20 20 66 73 65 65 6b 28 69 6e 2c 20  ");.  fseek(in, 
0cc0: 30 4c 2c 20 53 45 45 4b 5f 45 4e 44 29 3b 0a 20  0L, SEEK_END);. 
0cd0: 20 6e 53 71 6c 20 3d 20 66 74 65 6c 6c 28 69 6e   nSql = ftell(in
0ce0: 29 3b 0a 20 20 7a 53 71 6c 20 3d 20 6d 61 6c 6c  );.  zSql = mall
0cf0: 6f 63 28 20 6e 53 71 6c 2b 31 20 29 3b 0a 20 20  oc( nSql+1 );.  
0d00: 66 73 65 65 6b 28 69 6e 2c 20 30 4c 2c 20 53 45  fseek(in, 0L, SE
0d10: 45 4b 5f 53 45 54 29 3b 0a 20 20 6e 53 71 6c 20  EK_SET);.  nSql 
0d20: 3d 20 66 72 65 61 64 28 7a 53 71 6c 2c 20 31 2c  = fread(zSql, 1,
0d30: 20 6e 53 71 6c 2c 20 69 6e 29 3b 0a 20 20 7a 53   nSql, in);.  zS
0d40: 71 6c 5b 6e 53 71 6c 5d 20 3d 20 30 3b 0a 0a 20  ql[nSql] = 0;.. 
0d50: 20 70 72 69 6e 74 66 28 22 53 51 4c 69 74 65 20   printf("SQLite 
0d60: 76 65 72 73 69 6f 6e 3a 20 25 64 5c 6e 22 2c 20  version: %d\n", 
0d70: 73 71 6c 69 74 65 33 5f 6c 69 62 76 65 72 73 69  sqlite3_libversi
0d80: 6f 6e 5f 6e 75 6d 62 65 72 28 29 29 3b 0a 20 20  on_number());.  
0d90: 75 6e 6c 69 6e 6b 28 61 72 67 76 5b 31 5d 29 3b  unlink(argv[1]);
0da0: 0a 20 20 75 74 66 31 36 20 3d 20 61 73 63 69 69  .  utf16 = ascii
0db0: 54 6f 55 74 66 31 36 6c 65 28 61 72 67 76 5b 31  ToUtf16le(argv[1
0dc0: 5d 29 3b 0a 20 20 69 53 74 61 72 74 20 3d 20 73  ]);.  iStart = s
0dd0: 71 6c 69 74 65 33 48 77 74 69 6d 65 28 29 3b 0a  qlite3Hwtime();.
0de0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 6f    rc = sqlite3_o
0df0: 70 65 6e 31 36 28 75 74 66 31 36 2c 20 26 64 62  pen16(utf16, &db
0e00: 29 3b 0a 20 20 69 45 6c 61 70 73 65 20 3d 20 73  );.  iElapse = s
0e10: 71 6c 69 74 65 33 48 77 74 69 6d 65 28 29 20 2d  qlite3Hwtime() -
0e20: 20 69 53 74 61 72 74 3b 0a 20 20 69 53 65 74 75   iStart;.  iSetu
0e30: 70 20 3d 20 69 45 6c 61 70 73 65 3b 0a 20 20 70  p = iElapse;.  p
0e40: 72 69 6e 74 66 28 22 73 71 6c 69 74 65 33 5f 6f  rintf("sqlite3_o
0e50: 70 65 6e 31 36 28 29 20 72 65 74 75 72 6e 73 20  pen16() returns 
0e60: 25 64 20 69 6e 20 25 6c 6c 75 20 63 79 63 6c 65  %d in %llu cycle
0e70: 73 5c 6e 22 2c 20 72 63 2c 20 69 45 6c 61 70 73  s\n", rc, iElaps
0e80: 65 29 3b 0a 20 20 66 72 65 65 28 75 74 66 31 36  e);.  free(utf16
0e90: 29 3b 0a 20 20 66 6f 72 28 69 3d 6a 3d 30 3b 20  );.  for(i=j=0; 
0ea0: 6a 3c 6e 53 71 6c 3b 20 6a 2b 2b 29 7b 0a 20 20  j<nSql; j++){.  
0eb0: 20 20 69 66 28 20 7a 53 71 6c 5b 6a 5d 3d 3d 27    if( zSql[j]=='
0ec0: 3b 27 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  ;' ){.      int 
0ed0: 69 73 43 6f 6d 70 6c 65 74 65 3b 0a 20 20 20 20  isComplete;.    
0ee0: 20 20 63 68 61 72 20 63 20 3d 20 7a 53 71 6c 5b    char c = zSql[
0ef0: 6a 2b 31 5d 3b 0a 20 20 20 20 20 20 7a 53 71 6c  j+1];.      zSql
0f00: 5b 6a 2b 31 5d 20 3d 20 30 3b 0a 20 20 20 20 20  [j+1] = 0;.     
0f10: 20 69 73 43 6f 6d 70 6c 65 74 65 20 3d 20 73 71   isComplete = sq
0f20: 6c 69 74 65 33 5f 63 6f 6d 70 6c 65 74 65 28 26  lite3_complete(&
0f30: 7a 53 71 6c 5b 69 5d 29 3b 0a 20 20 20 20 20 20  zSql[i]);.      
0f40: 7a 53 71 6c 5b 6a 2b 31 5d 20 3d 20 63 3b 0a 20  zSql[j+1] = c;. 
0f50: 20 20 20 20 20 69 66 28 20 69 73 43 6f 6d 70 6c       if( isCompl
0f60: 65 74 65 20 29 7b 0a 20 20 20 20 20 20 20 20 7a  ete ){.        z
0f70: 53 71 6c 5b 6a 5d 20 3d 20 30 3b 0a 20 20 20 20  Sql[j] = 0;.    
0f80: 20 20 20 20 77 68 69 6c 65 28 20 69 3c 6a 20 26      while( i<j &
0f90: 26 20 49 53 53 50 41 43 45 28 7a 53 71 6c 5b 69  & ISSPACE(zSql[i
0fa0: 5d 29 20 29 7b 20 69 2b 2b 3b 20 7d 0a 20 20 20  ]) ){ i++; }.   
0fb0: 20 20 20 20 20 69 66 28 20 69 3c 6a 20 29 7b 0a       if( i<j ){.
0fc0: 20 20 20 20 20 20 20 20 20 20 6e 53 74 6d 74 2b            nStmt+
0fd0: 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 6e 42 79  +;.          nBy
0fe0: 74 65 20 2b 3d 20 6a 2d 69 3b 0a 20 20 20 20 20  te += j-i;.     
0ff0: 20 20 20 20 20 70 72 65 70 61 72 65 41 6e 64 52       prepareAndR
1000: 75 6e 28 64 62 2c 20 26 7a 53 71 6c 5b 69 5d 29  un(db, &zSql[i])
1010: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
1020: 20 20 20 20 7a 53 71 6c 5b 6a 5d 20 3d 20 27 3b      zSql[j] = ';
1030: 27 3b 0a 20 20 20 20 20 20 20 20 69 20 3d 20 6a  ';.        i = j
1040: 2b 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  +1;.      }.    
1050: 7d 0a 20 20 7d 0a 20 20 69 53 74 61 72 74 20 3d  }.  }.  iStart =
1060: 20 73 71 6c 69 74 65 33 48 77 74 69 6d 65 28 29   sqlite3Hwtime()
1070: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73  ;.  sqlite3_clos
1080: 65 28 64 62 29 3b 0a 20 20 69 45 6c 61 70 73 65  e(db);.  iElapse
1090: 20 3d 20 73 71 6c 69 74 65 33 48 77 74 69 6d 65   = sqlite3Hwtime
10a0: 28 29 20 2d 20 69 53 74 61 72 74 3b 0a 20 20 69  () - iStart;.  i
10b0: 53 65 74 75 70 20 2b 3d 20 69 45 6c 61 70 73 65  Setup += iElapse
10c0: 3b 0a 20 20 70 72 69 6e 74 66 28 22 73 71 6c 69  ;.  printf("sqli
10d0: 74 65 33 5f 63 6c 6f 73 65 28 29 20 72 65 74 75  te3_close() retu
10e0: 72 6e 73 20 69 6e 20 25 6c 6c 75 20 63 79 63 6c  rns in %llu cycl
10f0: 65 73 5c 6e 22 2c 20 69 45 6c 61 70 73 65 29 3b  es\n", iElapse);
1100: 0a 20 20 70 72 69 6e 74 66 28 22 5c 6e 22 29 3b  .  printf("\n");
1110: 0a 20 20 70 72 69 6e 74 66 28 22 53 74 61 74 65  .  printf("State
1120: 6d 65 6e 74 73 20 72 75 6e 3a 20 20 20 20 20 20  ments run:      
1130: 20 25 31 35 64 5c 6e 22 2c 20 6e 53 74 6d 74 29   %15d\n", nStmt)
1140: 3b 0a 20 20 70 72 69 6e 74 66 28 22 42 79 74 65  ;.  printf("Byte
1150: 73 20 6f 66 20 53 51 4c 20 74 65 78 74 3a 20 20  s of SQL text:  
1160: 20 20 25 31 35 64 5c 6e 22 2c 20 6e 42 79 74 65    %15d\n", nByte
1170: 29 3b 0a 20 20 70 72 69 6e 74 66 28 22 54 6f 74  );.  printf("Tot
1180: 61 6c 20 70 72 65 70 61 72 65 20 74 69 6d 65 3a  al prepare time:
1190: 20 20 20 25 31 35 6c 6c 75 20 63 79 63 6c 65 73     %15llu cycles
11a0: 5c 6e 22 2c 20 70 72 65 70 54 69 6d 65 29 3b 0a  \n", prepTime);.
11b0: 20 20 70 72 69 6e 74 66 28 22 54 6f 74 61 6c 20    printf("Total 
11c0: 72 75 6e 20 74 69 6d 65 3a 20 20 20 20 20 20 20  run time:       
11d0: 25 31 35 6c 6c 75 20 63 79 63 6c 65 73 5c 6e 22  %15llu cycles\n"
11e0: 2c 20 72 75 6e 54 69 6d 65 29 3b 0a 20 20 70 72  , runTime);.  pr
11f0: 69 6e 74 66 28 22 54 6f 74 61 6c 20 66 69 6e 61  intf("Total fina
1200: 6c 69 7a 65 20 74 69 6d 65 3a 20 20 25 31 35 6c  lize time:  %15l
1210: 6c 75 20 63 79 63 6c 65 73 5c 6e 22 2c 20 66 69  lu cycles\n", fi
1220: 6e 61 6c 69 7a 65 54 69 6d 65 29 3b 0a 20 20 70  nalizeTime);.  p
1230: 72 69 6e 74 66 28 22 4f 70 65 6e 2f 43 6c 6f 73  rintf("Open/Clos
1240: 65 20 74 69 6d 65 3a 20 20 20 20 20 20 25 31 35  e time:      %15
1250: 6c 6c 75 20 63 79 63 6c 65 73 5c 6e 22 2c 20 69  llu cycles\n", i
1260: 53 65 74 75 70 29 3b 0a 20 20 70 72 69 6e 74 66  Setup);.  printf
1270: 28 22 54 6f 74 61 6c 20 54 69 6d 65 3a 20 20 20  ("Total Time:   
1280: 20 20 20 20 20 20 20 20 25 31 35 6c 6c 75 20 63          %15llu c
1290: 79 63 6c 65 73 5c 6e 22 2c 0a 20 20 20 20 20 20  ycles\n",.      
12a0: 70 72 65 70 54 69 6d 65 20 2b 20 72 75 6e 54 69  prepTime + runTi
12b0: 6d 65 20 2b 20 66 69 6e 61 6c 69 7a 65 54 69 6d  me + finalizeTim
12c0: 65 20 2b 20 69 53 65 74 75 70 29 3b 0a 20 20 72  e + iSetup);.  r
12d0: 65 74 75 72 6e 20 30 3b 0a 7d 0a                 eturn 0;.}.