/ Hex Artifact Content
Login

Artifact c8a9c793df96db7e4933f0852abb7a03d48f2e81:


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 2f 2a 20 0a  sqlite3.h"../* .
03e0: 2a 2a 20 68 77 74 69 6d 65 2e 68 20 63 6f 6e 74  ** hwtime.h cont
03f0: 61 69 6e 73 20 69 6e 6c 69 6e 65 20 61 73 73 65  ains inline asse
0400: 6d 62 6c 65 72 20 63 6f 64 65 20 66 6f 72 20 69  mbler code for i
0410: 6d 70 6c 65 6d 65 6e 74 69 6e 67 20 0a 2a 2a 20  mplementing .** 
0420: 68 69 67 68 2d 70 65 72 66 6f 72 6d 61 6e 63 65  high-performance
0430: 20 74 69 6d 69 6e 67 20 72 6f 75 74 69 6e 65 73   timing routines
0440: 2e 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 22 68  ..*/.#include "h
0450: 77 74 69 6d 65 2e 68 22 0a 0a 2f 2a 0a 2a 2a 20  wtime.h"../*.** 
0460: 43 6f 6e 76 65 72 74 20 61 20 7a 65 72 6f 2d 74  Convert a zero-t
0470: 65 72 6d 69 6e 61 74 65 64 20 41 53 43 49 49 20  erminated ASCII 
0480: 73 74 72 69 6e 67 20 69 6e 74 6f 20 61 20 7a 65  string into a ze
0490: 72 6f 2d 74 65 72 6d 69 6e 61 74 65 64 0a 2a 2a  ro-terminated.**
04a0: 20 55 54 46 2d 31 36 6c 65 20 73 74 72 69 6e 67   UTF-16le string
04b0: 2e 20 20 4d 65 6d 6f 72 79 20 74 6f 20 68 6f 6c  .  Memory to hol
04c0: 64 20 74 68 65 20 72 65 74 75 72 6e 65 64 20 73  d the returned s
04d0: 74 72 69 6e 67 20 63 6f 6d 65 73 20 0a 2a 2a 20  tring comes .** 
04e0: 66 72 6f 6d 20 6d 61 6c 6c 6f 63 28 29 20 61 6e  from malloc() an
04f0: 64 20 73 68 6f 75 6c 64 20 62 65 20 66 72 65 65  d should be free
0500: 64 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72 2e  d by the caller.
0510: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
0520: 2a 61 73 63 69 69 54 6f 55 74 66 31 36 6c 65 28  *asciiToUtf16le(
0530: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 29 7b 0a  const char *z){.
0540: 20 20 69 6e 74 20 6e 20 3d 20 73 74 72 6c 65 6e    int n = strlen
0550: 28 7a 29 3b 0a 20 20 63 68 61 72 20 2a 7a 31 36  (z);.  char *z16
0560: 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 0a 20  ;.  int i, j;.. 
0570: 20 7a 31 36 20 3d 20 6d 61 6c 6c 6f 63 28 20 6e   z16 = malloc( n
0580: 2a 32 20 2b 20 32 20 29 3b 0a 20 20 66 6f 72 28  *2 + 2 );.  for(
0590: 69 3d 6a 3d 30 3b 20 69 3c 3d 6e 3b 20 69 2b 2b  i=j=0; i<=n; i++
05a0: 29 7b 0a 20 20 20 20 7a 31 36 5b 6a 2b 2b 5d 20  ){.    z16[j++] 
05b0: 3d 20 7a 5b 69 5d 3b 0a 20 20 20 20 7a 31 36 5b  = z[i];.    z16[
05c0: 6a 2b 2b 5d 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  j++] = 0;.  }.  
05d0: 72 65 74 75 72 6e 20 28 76 6f 69 64 2a 29 7a 31  return (void*)z1
05e0: 36 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 69 6d 65  6;.}../*.** Time
05f0: 72 73 0a 2a 2f 0a 73 74 61 74 69 63 20 73 71 6c  rs.*/.static sql
0600: 69 74 65 5f 75 69 6e 74 36 34 20 70 72 65 70 54  ite_uint64 prepT
0610: 69 6d 65 20 3d 20 30 3b 0a 73 74 61 74 69 63 20  ime = 0;.static 
0620: 73 71 6c 69 74 65 5f 75 69 6e 74 36 34 20 72 75  sqlite_uint64 ru
0630: 6e 54 69 6d 65 20 3d 20 30 3b 0a 73 74 61 74 69  nTime = 0;.stati
0640: 63 20 73 71 6c 69 74 65 5f 75 69 6e 74 36 34 20  c sqlite_uint64 
0650: 66 69 6e 61 6c 69 7a 65 54 69 6d 65 20 3d 20 30  finalizeTime = 0
0660: 3b 0a 0a 2f 2a 0a 2a 2a 20 50 72 65 70 61 72 65  ;../*.** Prepare
0670: 20 61 6e 64 20 72 75 6e 20 61 20 73 69 6e 67 6c   and run a singl
0680: 65 20 73 74 61 74 65 6d 65 6e 74 20 6f 66 20 53  e statement of S
0690: 51 4c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  QL..*/.static vo
06a0: 69 64 20 70 72 65 70 61 72 65 41 6e 64 52 75 6e  id prepareAndRun
06b0: 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 63 6f  (sqlite3 *db, co
06c0: 6e 73 74 20 63 68 61 72 20 2a 7a 53 71 6c 29 7b  nst char *zSql){
06d0: 0a 20 20 76 6f 69 64 20 2a 75 74 66 31 36 3b 0a  .  void *utf16;.
06e0: 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a    sqlite3_stmt *
06f0: 70 53 74 6d 74 3b 0a 20 20 63 6f 6e 73 74 20 76  pStmt;.  const v
0700: 6f 69 64 20 2a 73 74 6d 74 54 61 69 6c 3b 0a 20  oid *stmtTail;. 
0710: 20 73 71 6c 69 74 65 5f 75 69 6e 74 36 34 20 69   sqlite_uint64 i
0720: 53 74 61 72 74 2c 20 69 45 6c 61 70 73 65 3b 0a  Start, iElapse;.
0730: 20 20 69 6e 74 20 72 63 3b 0a 20 20 0a 20 20 70    int rc;.  .  p
0740: 72 69 6e 74 66 28 22 2a 2a 2a 2a 2a 2a 2a 2a 2a  rintf("*********
0750: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0760: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0770: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0780: 2a 2a 2a 2a 2a 2a 2a 5c 6e 22 29 3b 0a 20 20 70  *******\n");.  p
0790: 72 69 6e 74 66 28 22 53 51 4c 20 73 74 61 74 65  rintf("SQL state
07a0: 6d 65 6e 74 3a 20 5b 25 73 5d 5c 6e 22 2c 20 7a  ment: [%s]\n", z
07b0: 53 71 6c 29 3b 0a 20 20 75 74 66 31 36 20 3d 20  Sql);.  utf16 = 
07c0: 61 73 63 69 69 54 6f 55 74 66 31 36 6c 65 28 7a  asciiToUtf16le(z
07d0: 53 71 6c 29 3b 0a 20 20 69 53 74 61 72 74 20 3d  Sql);.  iStart =
07e0: 20 73 71 6c 69 74 65 33 48 77 74 69 6d 65 28 29   sqlite3Hwtime()
07f0: 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
0800: 5f 70 72 65 70 61 72 65 31 36 5f 76 32 28 64 62  _prepare16_v2(db
0810: 2c 20 75 74 66 31 36 2c 20 2d 31 2c 20 26 70 53  , utf16, -1, &pS
0820: 74 6d 74 2c 20 26 73 74 6d 74 54 61 69 6c 29 3b  tmt, &stmtTail);
0830: 0a 20 20 69 45 6c 61 70 73 65 20 3d 20 73 71 6c  .  iElapse = sql
0840: 69 74 65 33 48 77 74 69 6d 65 28 29 20 2d 20 69  ite3Hwtime() - i
0850: 53 74 61 72 74 3b 0a 20 20 70 72 65 70 54 69 6d  Start;.  prepTim
0860: 65 20 2b 3d 20 69 45 6c 61 70 73 65 3b 0a 20 20  e += iElapse;.  
0870: 70 72 69 6e 74 66 28 22 73 71 6c 69 74 65 33 5f  printf("sqlite3_
0880: 70 72 65 70 61 72 65 31 36 5f 76 32 28 29 20 72  prepare16_v2() r
0890: 65 74 75 72 6e 73 20 25 64 20 69 6e 20 25 6c 6c  eturns %d in %ll
08a0: 75 20 63 79 63 6c 65 73 5c 6e 22 2c 20 72 63 2c  u cycles\n", rc,
08b0: 20 69 45 6c 61 70 73 65 29 3b 0a 20 20 69 66 28   iElapse);.  if(
08c0: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
08d0: 7b 0a 20 20 20 20 69 6e 74 20 6e 52 6f 77 20 3d  {.    int nRow =
08e0: 20 30 3b 0a 20 20 20 20 69 53 74 61 72 74 20 3d   0;.    iStart =
08f0: 20 73 71 6c 69 74 65 33 48 77 74 69 6d 65 28 29   sqlite3Hwtime()
0900: 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 28 72 63  ;.    while( (rc
0910: 3d 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53  =sqlite3_step(pS
0920: 74 6d 74 29 29 3d 3d 53 51 4c 49 54 45 5f 52 4f  tmt))==SQLITE_RO
0930: 57 20 29 7b 20 6e 52 6f 77 2b 2b 3b 20 7d 0a 20  W ){ nRow++; }. 
0940: 20 20 20 69 45 6c 61 70 73 65 20 3d 20 73 71 6c     iElapse = sql
0950: 69 74 65 33 48 77 74 69 6d 65 28 29 20 2d 20 69  ite3Hwtime() - i
0960: 53 74 61 72 74 3b 0a 20 20 20 20 72 75 6e 54 69  Start;.    runTi
0970: 6d 65 20 2b 3d 20 69 45 6c 61 70 73 65 3b 0a 20  me += iElapse;. 
0980: 20 20 20 70 72 69 6e 74 66 28 22 73 71 6c 69 74     printf("sqlit
0990: 65 33 5f 73 74 65 70 28 29 20 72 65 74 75 72 6e  e3_step() return
09a0: 73 20 25 64 20 61 66 74 65 72 20 25 64 20 72 6f  s %d after %d ro
09b0: 77 73 20 69 6e 20 25 6c 6c 75 20 63 79 63 6c 65  ws in %llu cycle
09c0: 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  s\n",.          
09d0: 20 72 63 2c 20 6e 52 6f 77 2c 20 69 45 6c 61 70   rc, nRow, iElap
09e0: 73 65 29 3b 0a 20 20 20 20 69 53 74 61 72 74 20  se);.    iStart 
09f0: 3d 20 73 71 6c 69 74 65 33 48 77 74 69 6d 65 28  = sqlite3Hwtime(
0a00: 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  );.    rc = sqli
0a10: 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74  te3_finalize(pSt
0a20: 6d 74 29 3b 0a 20 20 20 20 69 45 6c 61 70 73 65  mt);.    iElapse
0a30: 20 3d 20 73 71 6c 69 74 65 33 48 77 74 69 6d 65   = sqlite3Hwtime
0a40: 28 29 20 2d 20 69 53 74 61 72 74 3b 0a 20 20 20  () - iStart;.   
0a50: 20 66 69 6e 61 6c 69 7a 65 54 69 6d 65 20 2b 3d   finalizeTime +=
0a60: 20 69 45 6c 61 70 73 65 3b 0a 20 20 20 20 70 72   iElapse;.    pr
0a70: 69 6e 74 66 28 22 73 71 6c 69 74 65 33 5f 66 69  intf("sqlite3_fi
0a80: 6e 61 6c 69 7a 65 28 29 20 72 65 74 75 72 6e 73  nalize() returns
0a90: 20 25 64 20 69 6e 20 25 6c 6c 75 20 63 79 63 6c   %d in %llu cycl
0aa0: 65 73 5c 6e 22 2c 20 72 63 2c 20 69 45 6c 61 70  es\n", rc, iElap
0ab0: 73 65 29 3b 0a 20 20 7d 0a 20 20 66 72 65 65 28  se);.  }.  free(
0ac0: 75 74 66 31 36 29 3b 0a 7d 0a 0a 69 6e 74 20 6d  utf16);.}..int m
0ad0: 61 69 6e 28 69 6e 74 20 61 72 67 63 2c 20 63 68  ain(int argc, ch
0ae0: 61 72 20 2a 2a 61 72 67 76 29 7b 0a 20 20 76 6f  ar **argv){.  vo
0af0: 69 64 20 2a 75 74 66 31 36 3b 0a 20 20 73 71 6c  id *utf16;.  sql
0b00: 69 74 65 33 20 2a 64 62 3b 0a 20 20 69 6e 74 20  ite3 *db;.  int 
0b10: 72 63 3b 0a 20 20 69 6e 74 20 6e 53 71 6c 3b 0a  rc;.  int nSql;.
0b20: 20 20 63 68 61 72 20 2a 7a 53 71 6c 3b 0a 20 20    char *zSql;.  
0b30: 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 46 49 4c 45  int i, j;.  FILE
0b40: 20 2a 69 6e 3b 0a 20 20 73 71 6c 69 74 65 5f 75   *in;.  sqlite_u
0b50: 69 6e 74 36 34 20 69 53 74 61 72 74 2c 20 69 45  int64 iStart, iE
0b60: 6c 61 70 73 65 3b 0a 20 20 73 71 6c 69 74 65 5f  lapse;.  sqlite_
0b70: 75 69 6e 74 36 34 20 69 53 65 74 75 70 20 3d 20  uint64 iSetup = 
0b80: 30 3b 0a 20 20 69 6e 74 20 6e 53 74 6d 74 20 3d  0;.  int nStmt =
0b90: 20 30 3b 0a 20 20 69 6e 74 20 6e 42 79 74 65 20   0;.  int nByte 
0ba0: 3d 20 30 3b 0a 0a 20 20 69 66 28 20 61 72 67 63  = 0;..  if( argc
0bb0: 21 3d 33 20 29 7b 0a 20 20 20 20 66 70 72 69 6e  !=3 ){.    fprin
0bc0: 74 66 28 73 74 64 65 72 72 2c 20 22 55 73 61 67  tf(stderr, "Usag
0bd0: 65 3a 20 25 73 20 46 49 4c 45 4e 41 4d 45 20 53  e: %s FILENAME S
0be0: 51 4c 2d 53 43 52 49 50 54 5c 6e 22 0a 20 20 20  QL-SCRIPT\n".   
0bf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0c00: 20 22 52 75 6e 73 20 53 51 4c 2d 53 43 52 49 50   "Runs SQL-SCRIP
0c10: 54 20 61 73 20 55 54 46 31 36 20 61 67 61 69 6e  T as UTF16 again
0c20: 73 74 20 61 20 55 54 46 31 36 20 64 61 74 61 62  st a UTF16 datab
0c30: 61 73 65 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  ase\n",.        
0c40: 20 20 20 20 20 20 20 20 20 20 20 20 61 72 67 76              argv
0c50: 5b 30 5d 29 3b 0a 20 20 20 20 65 78 69 74 28 31  [0]);.    exit(1
0c60: 29 3b 0a 20 20 7d 0a 20 20 69 6e 20 3d 20 66 6f  );.  }.  in = fo
0c70: 70 65 6e 28 61 72 67 76 5b 32 5d 2c 20 22 72 22  pen(argv[2], "r"
0c80: 29 3b 0a 20 20 66 73 65 65 6b 28 69 6e 2c 20 30  );.  fseek(in, 0
0c90: 4c 2c 20 53 45 45 4b 5f 45 4e 44 29 3b 0a 20 20  L, SEEK_END);.  
0ca0: 6e 53 71 6c 20 3d 20 66 74 65 6c 6c 28 69 6e 29  nSql = ftell(in)
0cb0: 3b 0a 20 20 7a 53 71 6c 20 3d 20 6d 61 6c 6c 6f  ;.  zSql = mallo
0cc0: 63 28 20 6e 53 71 6c 2b 31 20 29 3b 0a 20 20 66  c( nSql+1 );.  f
0cd0: 73 65 65 6b 28 69 6e 2c 20 30 4c 2c 20 53 45 45  seek(in, 0L, SEE
0ce0: 4b 5f 53 45 54 29 3b 0a 20 20 6e 53 71 6c 20 3d  K_SET);.  nSql =
0cf0: 20 66 72 65 61 64 28 7a 53 71 6c 2c 20 31 2c 20   fread(zSql, 1, 
0d00: 6e 53 71 6c 2c 20 69 6e 29 3b 0a 20 20 7a 53 71  nSql, in);.  zSq
0d10: 6c 5b 6e 53 71 6c 5d 20 3d 20 30 3b 0a 0a 20 20  l[nSql] = 0;..  
0d20: 70 72 69 6e 74 66 28 22 53 51 4c 69 74 65 20 76  printf("SQLite v
0d30: 65 72 73 69 6f 6e 3a 20 25 64 5c 6e 22 2c 20 73  ersion: %d\n", s
0d40: 71 6c 69 74 65 33 5f 6c 69 62 76 65 72 73 69 6f  qlite3_libversio
0d50: 6e 5f 6e 75 6d 62 65 72 28 29 29 3b 0a 20 20 75  n_number());.  u
0d60: 6e 6c 69 6e 6b 28 61 72 67 76 5b 31 5d 29 3b 0a  nlink(argv[1]);.
0d70: 20 20 75 74 66 31 36 20 3d 20 61 73 63 69 69 54    utf16 = asciiT
0d80: 6f 55 74 66 31 36 6c 65 28 61 72 67 76 5b 31 5d  oUtf16le(argv[1]
0d90: 29 3b 0a 20 20 69 53 74 61 72 74 20 3d 20 73 71  );.  iStart = sq
0da0: 6c 69 74 65 33 48 77 74 69 6d 65 28 29 3b 0a 20  lite3Hwtime();. 
0db0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 6f 70   rc = sqlite3_op
0dc0: 65 6e 31 36 28 75 74 66 31 36 2c 20 26 64 62 29  en16(utf16, &db)
0dd0: 3b 0a 20 20 69 45 6c 61 70 73 65 20 3d 20 73 71  ;.  iElapse = sq
0de0: 6c 69 74 65 33 48 77 74 69 6d 65 28 29 20 2d 20  lite3Hwtime() - 
0df0: 69 53 74 61 72 74 3b 0a 20 20 69 53 65 74 75 70  iStart;.  iSetup
0e00: 20 3d 20 69 45 6c 61 70 73 65 3b 0a 20 20 70 72   = iElapse;.  pr
0e10: 69 6e 74 66 28 22 73 71 6c 69 74 65 33 5f 6f 70  intf("sqlite3_op
0e20: 65 6e 31 36 28 29 20 72 65 74 75 72 6e 73 20 25  en16() returns %
0e30: 64 20 69 6e 20 25 6c 6c 75 20 63 79 63 6c 65 73  d in %llu cycles
0e40: 5c 6e 22 2c 20 72 63 2c 20 69 45 6c 61 70 73 65  \n", rc, iElapse
0e50: 29 3b 0a 20 20 66 72 65 65 28 75 74 66 31 36 29  );.  free(utf16)
0e60: 3b 0a 20 20 66 6f 72 28 69 3d 6a 3d 30 3b 20 6a  ;.  for(i=j=0; j
0e70: 3c 6e 53 71 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20  <nSql; j++){.   
0e80: 20 69 66 28 20 7a 53 71 6c 5b 6a 5d 3d 3d 27 3b   if( zSql[j]==';
0e90: 27 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  ' ){.      int i
0ea0: 73 43 6f 6d 70 6c 65 74 65 3b 0a 20 20 20 20 20  sComplete;.     
0eb0: 20 63 68 61 72 20 63 20 3d 20 7a 53 71 6c 5b 6a   char c = zSql[j
0ec0: 2b 31 5d 3b 0a 20 20 20 20 20 20 7a 53 71 6c 5b  +1];.      zSql[
0ed0: 6a 2b 31 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20  j+1] = 0;.      
0ee0: 69 73 43 6f 6d 70 6c 65 74 65 20 3d 20 73 71 6c  isComplete = sql
0ef0: 69 74 65 33 5f 63 6f 6d 70 6c 65 74 65 28 26 7a  ite3_complete(&z
0f00: 53 71 6c 5b 69 5d 29 3b 0a 20 20 20 20 20 20 7a  Sql[i]);.      z
0f10: 53 71 6c 5b 6a 2b 31 5d 20 3d 20 63 3b 0a 20 20  Sql[j+1] = c;.  
0f20: 20 20 20 20 69 66 28 20 69 73 43 6f 6d 70 6c 65      if( isComple
0f30: 74 65 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 53  te ){.        zS
0f40: 71 6c 5b 6a 5d 20 3d 20 30 3b 0a 20 20 20 20 20  ql[j] = 0;.     
0f50: 20 20 20 77 68 69 6c 65 28 20 69 3c 6a 20 26 26     while( i<j &&
0f60: 20 69 73 73 70 61 63 65 28 7a 53 71 6c 5b 69 5d   isspace(zSql[i]
0f70: 29 20 29 7b 20 69 2b 2b 3b 20 7d 0a 20 20 20 20  ) ){ i++; }.    
0f80: 20 20 20 20 69 66 28 20 69 3c 6a 20 29 7b 0a 20      if( i<j ){. 
0f90: 20 20 20 20 20 20 20 20 20 6e 53 74 6d 74 2b 2b           nStmt++
0fa0: 3b 0a 20 20 20 20 20 20 20 20 20 20 6e 42 79 74  ;.          nByt
0fb0: 65 20 2b 3d 20 6a 2d 69 3b 0a 20 20 20 20 20 20  e += j-i;.      
0fc0: 20 20 20 20 70 72 65 70 61 72 65 41 6e 64 52 75      prepareAndRu
0fd0: 6e 28 64 62 2c 20 26 7a 53 71 6c 5b 69 5d 29 3b  n(db, &zSql[i]);
0fe0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
0ff0: 20 20 20 7a 53 71 6c 5b 6a 5d 20 3d 20 27 3b 27     zSql[j] = ';'
1000: 3b 0a 20 20 20 20 20 20 20 20 69 20 3d 20 6a 2b  ;.        i = j+
1010: 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  1;.      }.    }
1020: 0a 20 20 7d 0a 20 20 69 53 74 61 72 74 20 3d 20  .  }.  iStart = 
1030: 73 71 6c 69 74 65 33 48 77 74 69 6d 65 28 29 3b  sqlite3Hwtime();
1040: 0a 20 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65  .  sqlite3_close
1050: 28 64 62 29 3b 0a 20 20 69 45 6c 61 70 73 65 20  (db);.  iElapse 
1060: 3d 20 73 71 6c 69 74 65 33 48 77 74 69 6d 65 28  = sqlite3Hwtime(
1070: 29 20 2d 20 69 53 74 61 72 74 3b 0a 20 20 69 53  ) - iStart;.  iS
1080: 65 74 75 70 20 2b 3d 20 69 45 6c 61 70 73 65 3b  etup += iElapse;
1090: 0a 20 20 70 72 69 6e 74 66 28 22 73 71 6c 69 74  .  printf("sqlit
10a0: 65 33 5f 63 6c 6f 73 65 28 29 20 72 65 74 75 72  e3_close() retur
10b0: 6e 73 20 69 6e 20 25 6c 6c 75 20 63 79 63 6c 65  ns in %llu cycle
10c0: 73 5c 6e 22 2c 20 69 45 6c 61 70 73 65 29 3b 0a  s\n", iElapse);.
10d0: 20 20 70 72 69 6e 74 66 28 22 5c 6e 22 29 3b 0a    printf("\n");.
10e0: 20 20 70 72 69 6e 74 66 28 22 53 74 61 74 65 6d    printf("Statem
10f0: 65 6e 74 73 20 72 75 6e 3a 20 20 20 20 20 20 20  ents run:       
1100: 25 31 35 64 5c 6e 22 2c 20 6e 53 74 6d 74 29 3b  %15d\n", nStmt);
1110: 0a 20 20 70 72 69 6e 74 66 28 22 42 79 74 65 73  .  printf("Bytes
1120: 20 6f 66 20 53 51 4c 20 74 65 78 74 3a 20 20 20   of SQL text:   
1130: 20 25 31 35 64 5c 6e 22 2c 20 6e 42 79 74 65 29   %15d\n", nByte)
1140: 3b 0a 20 20 70 72 69 6e 74 66 28 22 54 6f 74 61  ;.  printf("Tota
1150: 6c 20 70 72 65 70 61 72 65 20 74 69 6d 65 3a 20  l prepare time: 
1160: 20 20 25 31 35 6c 6c 75 20 63 79 63 6c 65 73 5c    %15llu cycles\
1170: 6e 22 2c 20 70 72 65 70 54 69 6d 65 29 3b 0a 20  n", prepTime);. 
1180: 20 70 72 69 6e 74 66 28 22 54 6f 74 61 6c 20 72   printf("Total r
1190: 75 6e 20 74 69 6d 65 3a 20 20 20 20 20 20 20 25  un time:       %
11a0: 31 35 6c 6c 75 20 63 79 63 6c 65 73 5c 6e 22 2c  15llu cycles\n",
11b0: 20 72 75 6e 54 69 6d 65 29 3b 0a 20 20 70 72 69   runTime);.  pri
11c0: 6e 74 66 28 22 54 6f 74 61 6c 20 66 69 6e 61 6c  ntf("Total final
11d0: 69 7a 65 20 74 69 6d 65 3a 20 20 25 31 35 6c 6c  ize time:  %15ll
11e0: 75 20 63 79 63 6c 65 73 5c 6e 22 2c 20 66 69 6e  u cycles\n", fin
11f0: 61 6c 69 7a 65 54 69 6d 65 29 3b 0a 20 20 70 72  alizeTime);.  pr
1200: 69 6e 74 66 28 22 4f 70 65 6e 2f 43 6c 6f 73 65  intf("Open/Close
1210: 20 74 69 6d 65 3a 20 20 20 20 20 20 25 31 35 6c   time:      %15l
1220: 6c 75 20 63 79 63 6c 65 73 5c 6e 22 2c 20 69 53  lu cycles\n", iS
1230: 65 74 75 70 29 3b 0a 20 20 70 72 69 6e 74 66 28  etup);.  printf(
1240: 22 54 6f 74 61 6c 20 54 69 6d 65 3a 20 20 20 20  "Total Time:    
1250: 20 20 20 20 20 20 20 25 31 35 6c 6c 75 20 63 79         %15llu cy
1260: 63 6c 65 73 5c 6e 22 2c 0a 20 20 20 20 20 20 70  cles\n",.      p
1270: 72 65 70 54 69 6d 65 20 2b 20 72 75 6e 54 69 6d  repTime + runTim
1280: 65 20 2b 20 66 69 6e 61 6c 69 7a 65 54 69 6d 65  e + finalizeTime
1290: 20 2b 20 69 53 65 74 75 70 29 3b 0a 20 20 72 65   + iSetup);.  re
12a0: 74 75 72 6e 20 30 3b 0a 7d 0a                    turn 0;.}.