Documentation Source Text

Hex Artifact Content
Login

Artifact 30de04a5bf4ee2b54f3ad4240d05430e7f4a0aceaff40cb1124ab82b320ec7d2:


0000: 3c 74 69 74 6c 65 3e 4d 65 61 73 75 72 69 6e 67  <title>Measuring
0010: 20 61 6e 64 20 52 65 64 75 63 69 6e 67 20 43 50   and Reducing CP
0020: 55 20 55 73 61 67 65 20 69 6e 20 53 51 4c 69 74  U Usage in SQLit
0030: 65 3c 2f 74 69 74 6c 65 3e 0a 3c 74 63 6c 3e 68  e</title>.<tcl>h
0040: 64 5f 6b 65 79 77 6f 72 64 73 20 7b 43 50 55 20  d_keywords {CPU 
0050: 63 79 63 6c 65 73 20 75 73 65 64 7d 20 7b 43 50  cycles used} {CP
0060: 55 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 6d 65  U performance me
0070: 61 73 75 72 65 6d 65 6e 74 7d 3c 2f 74 63 6c 3e  asurement}</tcl>
0080: 0a 0a 3c 74 61 62 6c 65 5f 6f 66 5f 63 6f 6e 74  ..<table_of_cont
0090: 65 6e 74 73 3e 0a 0a 3c 68 31 3e 4f 76 65 72 76  ents>..<h1>Overv
00a0: 69 65 77 3c 2f 68 31 3e 0a 0a 3c 70 3e 54 68 65  iew</h1>..<p>The
00b0: 20 67 72 61 70 68 20 62 65 6c 6f 77 20 73 68 6f   graph below sho
00c0: 77 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  ws the number of
00d0: 20 43 50 55 20 63 79 63 6c 65 73 20 75 73 65 64   CPU cycles used
00e0: 20 62 79 20 53 51 4c 69 74 65 20 6f 6e 20 61 0a   by SQLite on a.
00f0: 73 74 61 6e 64 61 72 64 20 77 6f 72 6b 6c 6f 61  standard workloa
0100: 64 2c 20 66 6f 72 20 76 65 72 73 69 6f 6e 73 20  d, for versions 
0110: 6f 66 20 53 51 4c 69 74 65 20 67 6f 69 6e 67 20  of SQLite going 
0120: 62 61 63 6b 20 61 62 6f 75 74 20 31 30 20 79 65  back about 10 ye
0130: 61 72 73 2e 0a 52 65 63 65 6e 74 20 76 65 72 73  ars..Recent vers
0140: 69 6f 6e 73 20 6f 66 20 53 51 4c 69 74 65 20 75  ions of SQLite u
0150: 73 65 20 61 62 6f 75 74 20 6f 6e 65 20 74 68 69  se about one thi
0160: 72 64 20 61 73 20 6d 61 6e 79 20 74 68 65 20 43  rd as many the C
0170: 50 55 20 63 79 63 6c 65 73 0a 63 6f 6d 70 61 72  PU cycles.compar
0180: 65 64 20 74 6f 20 6f 6c 64 65 72 20 76 65 72 73  ed to older vers
0190: 69 6f 6e 73 2e 0a 0a 3c 70 3e 0a 54 68 69 73 20  ions...<p>.This 
01a0: 61 72 74 69 63 6c 65 20 64 65 73 63 72 69 62 65  article describe
01b0: 73 20 68 6f 77 20 74 68 65 20 53 51 4c 69 74 65  s how the SQLite
01c0: 20 64 65 76 65 6c 6f 70 65 72 73 20 6d 65 61 73   developers meas
01d0: 75 72 65 20 43 50 55 20 75 73 61 67 65 2c 0a 77  ure CPU usage,.w
01e0: 68 61 74 20 74 68 6f 73 65 20 6d 65 61 73 75 72  hat those measur
01f0: 65 6d 65 6e 74 73 20 61 63 74 75 61 6c 6c 79 20  ements actually 
0200: 6d 65 61 6e 2c 20 61 6e 64 20 74 68 65 20 74 65  mean, and the te
0210: 63 68 6e 69 71 75 65 73 20 75 73 65 64 20 62 79  chniques used by
0220: 0a 53 51 4c 69 74 65 20 64 65 76 65 6c 6f 70 65  .SQLite develope
0230: 72 73 20 6f 6e 20 74 68 65 69 72 20 63 6f 6e 74  rs on their cont
0240: 69 6e 75 69 6e 67 20 71 75 65 73 74 20 74 6f 20  inuing quest to 
0250: 66 75 72 74 68 65 72 20 72 65 64 75 63 65 20 74  further reduce t
0260: 68 65 0a 43 50 55 20 75 73 61 67 65 20 6f 66 20  he.CPU usage of 
0270: 74 68 65 20 53 51 4c 69 74 65 20 6c 69 62 72 61  the SQLite libra
0280: 72 79 2e 0a 3c 2f 70 3e 0a 0a 3c 63 65 6e 74 65  ry..</p>..<cente
0290: 72 3e 0a 3c 68 72 3e 0a 3c 64 69 76 20 63 6c 61  r>.<hr>.<div cla
02a0: 73 73 3d 22 69 6d 67 63 6f 6e 74 61 69 6e 65 72  ss="imgcontainer
02b0: 22 3e 0a 3c 69 6d 67 20 73 72 63 3d 22 2e 2f 69  ">.<img src="./i
02c0: 6d 61 67 65 73 2f 63 70 75 2d 75 73 61 67 65 2e  mages/cpu-usage.
02d0: 6a 70 67 22 3e 3c 2f 69 6d 67 3e 3c 2f 64 69 76  jpg"></img></div
02e0: 3e 3c 62 72 3e 0a 4d 65 61 73 75 72 65 64 20 75  ><br>.Measured u
02f0: 73 69 6e 67 20 63 61 63 68 65 67 72 69 6e 64 20  sing cachegrind 
0300: 6f 6e 20 55 62 75 6e 74 75 20 31 36 2e 30 34 20  on Ubuntu 16.04 
0310: 6f 6e 20 78 36 34 20 77 69 74 68 20 67 63 63 20  on x64 with gcc 
0320: 35 2e 34 2e 30 20 61 6e 64 20 2d 4f 73 2e 3c 62  5.4.0 and -Os.<b
0330: 72 3e 0a 3c 68 72 3e 0a 3c 2f 63 65 6e 74 65 72  r>.<hr>.</center
0340: 3e 0a 0a 3c 68 31 3e 4d 65 61 73 75 72 69 6e 67  >..<h1>Measuring
0350: 20 50 65 72 66 6f 72 6d 61 6e 63 65 3c 2f 68 31   Performance</h1
0360: 3e 0a 0a 3c 70 3e 49 6e 20 62 72 69 65 66 2c 20  >..<p>In brief, 
0370: 74 68 65 20 43 50 55 20 70 65 72 66 6f 72 6d 61  the CPU performa
0380: 6e 63 65 20 6f 66 20 53 51 4c 69 74 65 20 69 73  nce of SQLite is
0390: 20 6d 65 61 73 75 72 65 64 20 61 73 20 66 6f 6c   measured as fol
03a0: 6c 6f 77 73 3a 0a 0a 3c 70 3e 3c 6f 6c 3e 0a 3c  lows:..<p><ol>.<
03b0: 6c 69 3e 20 43 6f 6d 70 69 6c 65 20 53 51 4c 69  li> Compile SQLi
03c0: 74 65 20 69 6e 20 61 6e 20 61 73 2d 64 65 6c 69  te in an as-deli
03d0: 76 65 72 65 64 20 63 6f 6e 66 69 67 75 72 61 74  vered configurat
03e0: 69 6f 6e 2c 20 77 69 74 68 6f 75 74 20 61 6e 79  ion, without any
03f0: 20 73 70 65 63 69 61 6c 0a 20 20 20 20 20 74 65   special.     te
0400: 6c 65 6d 65 74 72 79 20 6f 72 20 64 65 62 75 67  lemetry or debug
0410: 67 69 6e 67 20 6f 70 74 69 6f 6e 73 2e 0a 3c 6c  ging options..<l
0420: 69 3e 20 4c 69 6e 6b 20 53 51 4c 69 74 65 20 61  i> Link SQLite a
0430: 67 61 69 6e 73 74 20 61 20 74 65 73 74 20 70 72  gainst a test pr
0440: 6f 67 72 61 6d 20 74 68 61 74 20 72 75 6e 73 20  ogram that runs 
0450: 61 70 70 72 6f 78 69 6d 61 74 65 6c 79 20 33 30  approximately 30
0460: 2c 30 30 30 0a 20 20 20 20 20 53 51 4c 20 73 74  ,000.     SQL st
0470: 61 74 65 6d 65 6e 74 73 20 72 65 70 72 65 73 65  atements represe
0480: 6e 74 69 6e 67 20 61 20 74 79 70 69 63 61 6c 20  nting a typical 
0490: 77 6f 72 6b 6c 6f 61 64 2e 0a 3c 6c 69 3e 20 43  workload..<li> C
04a0: 6f 75 6e 74 20 74 68 65 20 6e 75 6d 62 65 72 20  ount the number 
04b0: 6f 66 20 43 50 55 20 63 79 63 6c 65 73 20 63 6f  of CPU cycles co
04c0: 6e 73 75 6d 65 64 20 75 73 69 6e 67 0a 20 20 20  nsumed using.   
04d0: 20 20 5b 68 74 74 70 3a 2f 2f 76 61 6c 67 72 69    [http://valgri
04e0: 6e 64 2e 6f 72 67 2f 64 6f 63 73 2f 6d 61 6e 75  nd.org/docs/manu
04f0: 61 6c 2f 63 67 2d 6d 61 6e 75 61 6c 2e 68 74 6d  al/cg-manual.htm
0500: 6c 7c 63 61 63 68 65 67 72 69 6e 64 5d 2e 0a 3c  l|cachegrind]..<
0510: 2f 6f 6c 3e 0a 0a 3c 68 32 3e 43 6f 6d 70 69 6c  /ol>..<h2>Compil
0520: 65 20 4f 70 74 69 6f 6e 73 3c 2f 68 32 3e 0a 0a  e Options</h2>..
0530: 3c 70 3e 46 6f 72 20 70 65 72 66 6f 72 6d 61 6e  <p>For performan
0540: 63 65 20 6d 65 61 73 75 72 65 6d 65 6e 74 2c 20  ce measurement, 
0550: 53 51 4c 69 74 65 20 69 73 20 63 6f 6d 70 69 6c  SQLite is compil
0560: 65 64 20 69 6e 20 61 70 70 72 6f 78 69 6d 61 74  ed in approximat
0570: 65 6c 79 20 74 68 65 20 73 61 6d 65 0a 77 61 79  ely the same.way
0580: 20 61 73 20 69 74 20 77 6f 75 6c 64 20 62 65 20   as it would be 
0590: 66 6f 72 20 75 73 65 20 69 6e 20 70 72 6f 64 75  for use in produ
05a0: 63 74 69 6f 6e 20 73 79 73 74 65 6d 73 2e 20 20  ction systems.  
05b0: 54 68 65 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65  The compile-time
05c0: 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 0a 69   configuration.i
05d0: 73 20 22 61 70 70 72 6f 78 69 6d 61 74 65 22 20  s "approximate" 
05e0: 69 6e 20 74 68 65 20 73 65 6e 73 65 20 74 68 61  in the sense tha
05f0: 74 20 65 76 65 72 79 20 70 72 6f 64 75 63 74 69  t every producti
0600: 6f 6e 20 75 73 65 20 6f 66 20 53 51 4c 69 74 65  on use of SQLite
0610: 20 69 73 20 0a 64 69 66 66 65 72 65 6e 74 2e 20   is .different. 
0620: 43 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 6f 70 74  Compile-time opt
0630: 69 6f 6e 73 20 75 73 65 64 20 62 79 20 6f 6e 65  ions used by one
0640: 20 73 79 73 74 65 6d 20 61 72 65 20 6e 6f 74 20   system are not 
0650: 6e 65 63 65 73 73 61 72 69 6c 79 0a 74 68 65 20  necessarily.the 
0660: 73 61 6d 65 20 61 73 20 74 68 6f 73 65 20 75 73  same as those us
0670: 65 64 20 62 79 20 6f 74 68 65 72 73 2e 20 20 54  ed by others.  T
0680: 68 65 20 6b 65 79 20 70 6f 69 6e 74 20 69 73 20  he key point is 
0690: 74 68 61 74 20 6f 70 74 69 6f 6e 73 20 74 68 61  that options tha
06a0: 74 20 0a 73 69 67 6e 69 66 69 63 61 6e 74 6c 79  t .significantly
06b0: 20 69 6d 70 61 63 74 20 74 68 65 20 67 65 6e 65   impact the gene
06c0: 72 61 74 65 64 20 6d 61 63 68 69 6e 65 20 63 6f  rated machine co
06d0: 64 65 20 61 72 65 20 61 76 6f 69 64 65 64 2e 20  de are avoided. 
06e0: 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 0a 74 68   For example,.th
06f0: 65 20 2d 44 53 51 4c 49 54 45 5f 44 45 42 55 47  e -DSQLITE_DEBUG
0700: 20 6f 70 74 69 6f 6e 20 69 73 20 6f 6d 69 74 74   option is omitt
0710: 65 64 20 62 65 63 61 75 73 65 20 74 68 61 74 20  ed because that 
0720: 6f 70 74 69 6f 6e 20 69 6e 73 65 72 74 73 20 74  option inserts t
0730: 68 6f 75 73 61 6e 64 73 0a 6f 66 20 61 73 73 65  housands.of asse
0740: 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74 73 20  rt() statements 
0750: 69 6e 20 74 68 65 20 6d 69 64 64 6c 65 20 6f 66  in the middle of
0760: 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 63 72 69   performance cri
0770: 74 69 63 61 6c 20 73 65 63 74 69 6f 6e 73 20 6f  tical sections o
0780: 66 20 74 68 65 0a 53 51 4c 69 74 65 20 6c 69 62  f the.SQLite lib
0790: 72 61 72 79 2e 20 20 54 68 65 20 2d 70 67 20 6f  rary.  The -pg o
07a0: 70 74 69 6f 6e 20 28 6f 6e 20 47 43 43 29 20 69  ption (on GCC) i
07b0: 73 20 6f 6d 69 74 74 65 64 20 62 65 63 61 75 73  s omitted becaus
07c0: 65 20 69 74 20 63 61 75 73 65 73 20 74 68 65 0a  e it causes the.
07d0: 63 6f 6d 70 69 6c 65 72 20 74 6f 20 65 6d 69 74  compiler to emit
07e0: 20 65 78 74 72 61 20 70 72 6f 62 61 62 69 6c 69   extra probabili
07f0: 73 74 69 63 20 70 65 72 66 6f 72 6d 61 6e 63 65  stic performance
0800: 20 6d 65 61 73 75 72 69 6e 67 20 63 6f 64 65 20   measuring code 
0810: 77 68 69 63 68 20 69 6e 74 65 72 66 65 72 65 73  which interferes
0820: 0a 77 69 74 68 20 61 63 74 75 61 6c 20 70 65 72  .with actual per
0830: 66 6f 72 6d 61 6e 63 65 20 6d 65 61 73 75 72 65  formance measure
0840: 6d 65 6e 74 73 2e 0a 0a 3c 70 3e 0a 46 6f 72 20  ments...<p>.For 
0850: 70 65 72 66 6f 72 6d 61 6e 63 65 20 6d 65 61 73  performance meas
0860: 75 72 65 6d 65 6e 74 73 2c 0a 74 68 65 20 2d 4f  urements,.the -O
0870: 73 20 6f 70 74 69 6f 6e 20 69 73 20 75 73 65 64  s option is used
0880: 20 28 6f 70 74 69 6d 69 7a 65 20 66 6f 72 20 73   (optimize for s
0890: 69 7a 65 29 20 72 61 74 68 65 72 20 74 68 61 6e  ize) rather than
08a0: 20 2d 4f 32 20 62 65 63 61 75 73 65 20 74 68 65   -O2 because the
08b0: 0a 2d 4f 32 20 6f 70 74 69 6f 6e 20 63 72 65 61  .-O2 option crea
08c0: 74 65 73 20 73 6f 20 6d 75 63 68 20 63 6f 64 65  tes so much code
08d0: 20 6d 6f 76 65 6d 65 6e 74 20 74 68 61 74 20 69   movement that i
08e0: 74 20 69 73 20 64 69 66 66 69 63 75 6c 74 20 74  t is difficult t
08f0: 6f 20 61 73 73 6f 63 69 61 74 65 0a 73 70 65 63  o associate.spec
0900: 69 66 69 63 20 43 50 55 20 69 6e 73 74 72 75 63  ific CPU instruc
0910: 74 69 6f 6e 73 20 74 6f 20 43 20 73 6f 75 72 63  tions to C sourc
0920: 65 20 63 6f 64 65 20 6c 69 6e 65 73 2e 0a 0a 3c  e code lines...<
0930: 68 32 3e 57 6f 72 6b 6c 6f 61 64 3c 2f 68 32 3e  h2>Workload</h2>
0940: 0a 0a 3c 70 3e 0a 54 68 65 20 22 74 79 70 69 63  ..<p>.The "typic
0950: 61 6c 22 20 77 6f 72 6b 6c 6f 61 64 20 69 73 20  al" workload is 
0960: 67 65 6e 65 72 61 74 65 64 20 62 79 20 74 68 65  generated by the
0970: 0a 5b 68 74 74 70 73 3a 2f 2f 73 71 6c 69 74 65  .[https://sqlite
0980: 2e 6f 72 67 2f 73 72 63 2f 66 69 6c 65 2f 74 65  .org/src/file/te
0990: 73 74 2f 73 70 65 65 64 74 65 73 74 31 2e 63 7c  st/speedtest1.c|
09a0: 73 70 65 65 64 74 65 73 74 31 2e 63 5d 0a 70 72  speedtest1.c].pr
09b0: 6f 67 72 61 6d 20 69 6e 20 74 68 65 20 63 61 6e  ogram in the can
09c0: 6f 6e 69 63 61 6c 20 53 51 4c 69 74 65 20 73 6f  onical SQLite so
09d0: 75 72 63 65 20 74 72 65 65 2e 20 20 54 68 69 73  urce tree.  This
09e0: 20 70 72 6f 67 72 61 6d 20 73 74 72 69 76 65 73   program strives
09f0: 20 74 6f 0a 65 78 65 72 63 69 73 65 20 74 68 65   to.exercise the
0a00: 20 53 51 4c 69 74 65 20 6c 69 62 72 61 72 79 20   SQLite library 
0a10: 69 6e 20 61 20 77 61 79 20 74 68 61 74 20 69 73  in a way that is
0a20: 20 74 79 70 69 63 61 6c 20 6f 66 20 72 65 61 6c   typical of real
0a30: 2d 77 6f 72 6c 64 0a 61 70 70 6c 69 63 61 74 69  -world.applicati
0a40: 6f 6e 73 2e 20 20 4f 66 20 63 6f 75 72 73 65 2c  ons.  Of course,
0a50: 20 65 76 65 72 79 20 61 70 70 6c 69 63 61 74 69   every applicati
0a60: 6f 6e 20 69 73 20 64 69 66 66 65 72 65 6e 74 2c  on is different,
0a70: 20 61 6e 64 20 73 6f 0a 6e 6f 20 74 65 73 74 20   and so.no test 
0a80: 70 72 6f 67 72 61 6d 20 63 61 6e 20 65 78 61 63  program can exac
0a90: 74 6c 79 20 6d 69 72 72 6f 72 20 74 68 65 20 62  tly mirror the b
0aa0: 65 68 61 76 69 6f 72 20 6f 66 20 61 6c 6c 20 61  ehavior of all a
0ab0: 70 70 6c 69 63 61 74 69 6f 6e 73 2e 0a 0a 3c 70  pplications...<p
0ac0: 3e 0a 54 68 65 20 73 70 65 65 64 74 65 73 74 31  >.The speedtest1
0ad0: 2e 63 20 70 72 6f 67 72 61 6d 20 69 73 20 75 70  .c program is up
0ae0: 64 61 74 65 64 20 66 72 6f 6d 20 74 69 6d 65 20  dated from time 
0af0: 74 6f 20 74 69 6d 65 20 61 73 20 74 68 65 20 53  to time as the S
0b00: 51 4c 69 74 65 0a 64 65 76 65 6c 6f 70 65 72 73  QLite.developers
0b10: 27 20 75 6e 64 65 72 73 74 61 6e 64 69 6e 67 20  ' understanding 
0b20: 6f 66 20 77 68 61 74 20 63 6f 6e 73 74 69 74 75  of what constitu
0b30: 74 65 73 20 22 74 79 70 69 63 61 6c 22 20 75 73  tes "typical" us
0b40: 61 67 65 20 65 76 6f 6c 76 65 73 2e 0a 0a 3c 70  age evolves...<p
0b50: 3e 0a 54 68 65 20 0a 5b 68 74 74 70 73 3a 2f 2f  >.The .[https://
0b60: 73 71 6c 69 74 65 2e 6f 72 67 2f 73 72 63 2f 66  sqlite.org/src/f
0b70: 69 6c 65 2f 74 6f 6f 6c 2f 73 70 65 65 64 2d 63  ile/tool/speed-c
0b80: 68 65 63 6b 2e 73 68 7c 73 70 65 65 64 2d 63 68  heck.sh|speed-ch
0b90: 65 63 6b 2e 73 68 5d 20 73 68 65 6c 6c 0a 73 63  eck.sh] shell.sc
0ba0: 72 69 70 74 2c 20 61 6c 73 6f 20 69 6e 20 74 68  ript, also in th
0bb0: 65 20 63 61 6e 6f 6e 69 63 61 6c 20 73 6f 75 72  e canonical sour
0bc0: 63 65 20 74 72 65 65 2c 20 69 73 20 75 73 65 64  ce tree, is used
0bd0: 20 74 6f 20 72 75 6e 20 74 68 65 20 73 70 65 65   to run the spee
0be0: 64 74 65 73 74 31 2e 63 0a 70 72 6f 67 72 61 6d  dtest1.c.program
0bf0: 2e 20 20 54 6f 20 72 65 70 6c 69 63 61 74 65 20  .  To replicate 
0c00: 74 68 65 20 70 65 72 66 6f 72 6d 61 6e 63 65 20  the performance 
0c10: 6d 65 61 73 75 72 65 6d 65 6e 74 73 2c 20 63 6f  measurements, co
0c20: 6c 6c 65 63 74 20 74 68 65 20 66 6f 6c 6c 6f 77  llect the follow
0c30: 69 6e 67 0a 66 69 6c 65 73 20 69 6e 74 6f 20 61  ing.files into a
0c40: 20 73 69 6e 67 6c 65 20 64 69 72 65 63 74 6f 72   single director
0c50: 79 3a 0a 3c 75 6c 3e 0a 3c 6c 69 3e 20 74 68 65  y:.<ul>.<li> the
0c60: 20 22 73 70 65 65 64 2d 63 68 65 63 6b 2e 73 68   "speed-check.sh
0c70: 22 20 73 63 72 69 70 74 2c 0a 3c 6c 69 3e 20 74  " script,.<li> t
0c80: 68 65 20 22 73 70 65 65 64 74 65 73 74 31 2e 63  he "speedtest1.c
0c90: 22 20 74 65 73 74 20 70 72 6f 67 72 61 6d 2c 20  " test program, 
0ca0: 61 6e 64 0a 3c 6c 69 3e 20 74 68 65 20 5b 61 6d  and.<li> the [am
0cb0: 61 6c 67 61 6d 61 74 69 6f 6e 7c 53 51 4c 69 74  algamation|SQLit
0cc0: 65 20 61 6d 61 6c 67 61 6d 61 74 69 6f 6e 5d 20  e amalgamation] 
0cd0: 73 6f 75 72 63 65 20 66 69 6c 65 73 20 22 73 71  source files "sq
0ce0: 6c 69 74 65 33 2e 63 22 20 61 6e 64 0a 20 20 20  lite3.c" and.   
0cf0: 20 20 22 73 71 6c 69 74 65 33 2e 68 22 0a 3c 2f    "sqlite3.h".</
0d00: 75 6c 3e 0a 3c 70 3e 0a 54 68 65 6e 20 72 75 6e  ul>.<p>.Then run
0d10: 20 22 73 68 20 73 70 65 65 64 2d 63 68 65 63 6b   "sh speed-check
0d20: 2e 73 68 20 74 72 75 6e 6b 22 2e 0a 0a 0a 3c 68  .sh trunk"....<h
0d30: 32 3e 50 65 72 66 6f 72 6d 61 6e 63 65 20 4d 65  2>Performance Me
0d40: 61 73 75 72 65 6d 65 6e 74 3c 2f 68 32 3e 0a 0a  asurement</h2>..
0d50: 3c 70 3e 0a 5b 68 74 74 70 3a 2f 2f 76 61 6c 67  <p>.[http://valg
0d60: 72 69 6e 64 2e 6f 72 67 2f 64 6f 63 73 2f 6d 61  rind.org/docs/ma
0d70: 6e 75 61 6c 2f 63 67 2d 6d 61 6e 75 61 6c 2e 68  nual/cg-manual.h
0d80: 74 6d 6c 7c 43 61 63 68 65 67 72 69 6e 64 5d 20  tml|Cachegrind] 
0d90: 69 73 20 75 73 65 64 20 74 6f 0a 6d 65 61 73 75  is used to.measu
0da0: 72 65 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 62  re performance b
0db0: 65 63 61 75 73 65 20 69 74 20 67 69 76 65 73 20  ecause it gives 
0dc0: 61 6e 73 77 65 72 73 20 74 68 61 74 20 61 72 65  answers that are
0dd0: 20 72 65 70 65 61 74 61 62 6c 65 20 74 6f 20 0a   repeatable to .
0de0: 37 20 6f 72 20 6d 6f 72 65 20 73 69 67 6e 69 66  7 or more signif
0df0: 69 63 61 6e 74 20 64 69 67 69 74 73 2e 20 20 49  icant digits.  I
0e00: 6e 20 63 6f 6d 70 61 72 69 73 6f 6e 2c 20 61 63  n comparison, ac
0e10: 74 75 61 6c 20 28 77 61 6c 6c 2d 63 6c 6f 63 6b  tual (wall-clock
0e20: 29 0a 72 75 6e 20 74 69 6d 65 73 20 61 72 65 20  ).run times are 
0e30: 73 63 61 72 63 65 6c 79 20 72 65 70 65 61 74 61  scarcely repeata
0e40: 62 6c 65 20 62 65 79 6f 6e 64 20 6f 6e 65 20 73  ble beyond one s
0e50: 69 67 6e 69 66 69 63 61 6e 74 20 64 69 67 69 74  ignificant digit
0e60: 2e 0a 0a 3c 74 63 6c 3e 68 64 5f 66 72 61 67 6d  ...<tcl>hd_fragm
0e70: 65 6e 74 20 6d 69 63 72 6f 6f 70 74 20 6d 69 63  ent microopt mic
0e80: 72 6f 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73 3c  rooptimizations<
0e90: 2f 74 63 6c 3e 0a 3c 68 32 3e 4d 69 63 72 6f 6f  /tcl>.<h2>Microo
0ea0: 70 74 69 6d 69 7a 61 74 69 6f 6e 73 3c 2f 68 32  ptimizations</h2
0eb0: 3e 0a 0a 3c 70 3e 0a 54 68 65 20 68 69 67 68 20  >..<p>.The high 
0ec0: 72 65 70 65 61 74 61 62 69 6c 69 74 79 20 6f 66  repeatability of
0ed0: 20 63 61 63 68 65 67 72 69 6e 64 20 61 6c 6c 6f   cachegrind allo
0ee0: 77 73 20 74 68 65 20 53 51 4c 69 74 65 20 64 65  ws the SQLite de
0ef0: 76 65 6c 6f 70 65 72 73 20 74 6f 0a 69 6d 70 6c  velopers to.impl
0f00: 65 6d 65 6e 74 20 61 6e 64 20 6d 65 61 73 75 72  ement and measur
0f10: 65 20 22 6d 69 63 72 6f 6f 70 74 69 6d 69 7a 61  e "microoptimiza
0f20: 74 69 6f 6e 73 22 2e 20 20 41 20 6d 69 63 72 6f  tions".  A micro
0f30: 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 69 73 0a  optimization is.
0f40: 61 20 63 68 61 6e 67 65 20 74 6f 20 74 68 65 20  a change to the 
0f50: 63 6f 64 65 20 74 68 61 74 20 72 65 73 75 6c 74  code that result
0f60: 73 20 69 6e 20 61 20 76 65 72 79 20 73 6d 61 6c  s in a very smal
0f70: 6c 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 69 6e  l performance in
0f80: 63 72 65 61 73 65 2e 0a 54 79 70 69 63 61 6c 20  crease..Typical 
0f90: 6d 69 63 72 6f 2d 6f 70 74 69 6d 69 7a 61 74 69  micro-optimizati
0fa0: 6f 6e 73 20 72 65 64 75 63 65 20 74 68 65 20 6e  ons reduce the n
0fb0: 75 6d 62 65 72 20 6f 66 20 43 50 55 20 63 79 63  umber of CPU cyc
0fc0: 6c 65 73 20 62 79 20 30 2e 31 25 20 6f 72 0a 30  les by 0.1% or.0
0fd0: 2e 30 35 25 20 6f 72 20 65 76 65 6e 20 6c 65 73  .05% or even les
0fe0: 73 2e 20 20 53 75 63 68 20 69 6d 70 72 6f 76 65  s.  Such improve
0ff0: 6d 65 6e 74 73 20 61 72 65 20 69 6d 70 6f 73 73  ments are imposs
1000: 69 62 6c 65 20 74 6f 20 6d 65 61 73 75 72 65 20  ible to measure 
1010: 77 69 74 68 0a 72 65 61 6c 2d 77 6f 72 6c 64 20  with.real-world 
1020: 74 69 6d 69 6e 67 73 2e 20 20 42 75 74 20 68 75  timings.  But hu
1030: 6e 64 72 65 64 73 20 6f 72 20 74 68 6f 75 73 61  ndreds or thousa
1040: 6e 64 73 20 6f 66 20 6d 69 63 72 6f 6f 70 74 69  nds of microopti
1050: 6d 69 7a 61 74 69 6f 6e 73 0a 61 64 64 20 75 70  mizations.add up
1060: 2c 20 72 65 73 75 6c 74 69 6e 67 20 69 6e 20 6d  , resulting in m
1070: 65 61 73 75 72 61 62 6c 65 20 72 65 61 6c 2d 77  easurable real-w
1080: 6f 72 6c 64 20 70 65 72 66 6f 72 6d 61 6e 63 65  orld performance
1090: 20 67 61 69 6e 73 2e 0a 0a 3c 68 31 3e 50 65 72   gains...<h1>Per
10a0: 66 6f 72 6d 61 6e 63 65 20 4d 65 61 73 75 72 65  formance Measure
10b0: 6d 65 6e 74 20 57 6f 72 6b 66 6c 6f 77 3c 2f 68  ment Workflow</h
10c0: 31 3e 0a 0a 3c 70 3e 0a 41 73 20 53 51 4c 69 74  1>..<p>.As SQLit
10d0: 65 20 64 65 76 65 6c 6f 70 65 72 73 20 65 64 69  e developers edi
10e0: 74 20 74 68 65 20 53 51 4c 69 74 65 20 73 6f 75  t the SQLite sou
10f0: 72 63 65 20 63 6f 64 65 2c 20 74 68 65 79 20 72  rce code, they r
1100: 75 6e 20 74 68 65 0a 5b 68 74 74 70 73 3a 2f 2f  un the.[https://
1110: 73 71 6c 69 74 65 2e 6f 72 67 2f 73 72 63 2f 66  sqlite.org/src/f
1120: 69 6c 65 2f 74 6f 6f 6c 2f 73 70 65 65 64 2d 63  ile/tool/speed-c
1130: 68 65 63 6b 2e 73 68 20 7c 20 73 70 65 65 64 2d  heck.sh | speed-
1140: 63 68 65 63 6b 2e 73 68 5d 0a 73 68 65 6c 6c 20  check.sh].shell 
1150: 73 63 72 69 70 74 20 74 6f 20 74 72 61 63 6b 20  script to track 
1160: 74 68 65 20 70 65 72 66 6f 72 6d 61 6e 63 65 20  the performance 
1170: 69 6d 70 61 63 74 20 6f 66 20 63 68 61 6e 67 65  impact of change
1180: 73 2e 20 20 54 68 69 73 0a 73 63 72 69 70 74 20  s.  This.script 
1190: 63 6f 6d 70 69 6c 65 73 20 74 68 65 20 73 70 65  compiles the spe
11a0: 65 64 74 65 73 74 31 2e 63 20 70 72 6f 67 72 61  edtest1.c progra
11b0: 6d 2c 20 72 75 6e 73 20 69 74 20 75 6e 64 65 72  m, runs it under
11c0: 20 63 61 63 68 65 67 72 69 6e 64 2c 0a 70 72 6f   cachegrind,.pro
11d0: 63 65 73 73 65 73 20 74 68 65 20 63 61 63 68 65  cesses the cache
11e0: 67 72 69 6e 64 20 6f 75 74 70 75 74 20 75 73 69  grind output usi
11f0: 6e 67 20 74 68 65 0a 5b 68 74 74 70 73 3a 2f 2f  ng the.[https://
1200: 73 71 6c 69 74 65 2e 6f 72 67 2f 73 72 63 2f 66  sqlite.org/src/f
1210: 69 6c 65 2f 74 6f 6f 6c 2f 63 67 5f 61 6e 6e 6f  ile/tool/cg_anno
1220: 2e 74 63 6c 20 7c 20 63 67 5f 61 6e 6e 6f 2e 74  .tcl | cg_anno.t
1230: 63 6c 5d 20 54 43 4c 0a 73 63 72 69 70 74 2c 20  cl] TCL.script, 
1240: 74 68 65 6e 20 73 61 76 65 73 20 74 68 65 20 72  then saves the r
1250: 65 73 75 6c 74 73 20 69 6e 20 61 20 73 65 72 69  esults in a seri
1260: 65 73 20 6f 66 20 74 65 78 74 20 66 69 6c 65 73  es of text files
1270: 2e 0a 54 79 70 69 63 61 6c 20 6f 75 74 70 75 74  ..Typical output
1280: 20 66 72 6f 6d 20 74 68 65 20 73 70 65 65 64 2d   from the speed-
1290: 63 68 65 63 6b 2e 73 68 20 73 63 72 69 70 74 20  check.sh script 
12a0: 6c 6f 6f 6b 73 20 6c 69 6b 65 20 74 68 69 73 3a  looks like this:
12b0: 0a 0a 3c 62 6c 6f 63 6b 71 75 6f 74 65 3e 3c 70  ..<blockquote><p
12c0: 72 65 3e 0a 3d 3d 38 36 38 33 3d 3d 20 0a 3d 3d  re>.==8683== .==
12d0: 38 36 38 33 3d 3d 20 49 20 20 20 72 65 66 73 3a  8683== I   refs:
12e0: 20 20 20 20 20 20 3c 66 6f 6e 74 20 63 6f 6c 6f        <font colo
12f0: 72 3d 22 72 65 64 22 3e 31 2c 30 36 30 2c 39 32  r="red">1,060,92
1300: 35 2c 37 36 38 3c 2f 66 6f 6e 74 3e 0a 3d 3d 38  5,768</font>.==8
1310: 36 38 33 3d 3d 20 49 31 20 20 6d 69 73 73 65 73  683== I1  misses
1320: 3a 20 20 20 20 20 20 20 32 33 2c 37 33 31 2c 32  :       23,731,2
1330: 34 36 0a 3d 3d 38 36 38 33 3d 3d 20 4c 4c 69 20  46.==8683== LLi 
1340: 6d 69 73 73 65 73 3a 20 20 20 20 20 20 20 20 20  misses:         
1350: 20 20 20 35 2c 31 37 36 0a 3d 3d 38 36 38 33 3d     5,176.==8683=
1360: 3d 20 49 31 20 20 6d 69 73 73 20 72 61 74 65 3a  = I1  miss rate:
1370: 20 20 20 20 20 20 20 20 20 20 32 2e 32 34 25 0a            2.24%.
1380: 3d 3d 38 36 38 33 3d 3d 20 4c 4c 69 20 6d 69 73  ==8683== LLi mis
1390: 73 20 72 61 74 65 3a 20 20 20 20 20 20 20 20 20  s rate:         
13a0: 20 30 2e 30 30 25 0a 3d 3d 38 36 38 33 3d 3d 20   0.00%.==8683== 
13b0: 0a 3d 3d 38 36 38 33 3d 3d 20 44 20 20 20 72 65  .==8683== D   re
13c0: 66 73 3a 20 20 20 20 20 20 20 20 35 35 37 2c 36  fs:        557,6
13d0: 38 36 2c 39 32 35 20 20 28 33 36 31 2c 38 32 38  86,925  (361,828
13e0: 2c 39 32 35 20 72 64 20 20 20 2b 20 31 39 35 2c  ,925 rd   + 195,
13f0: 38 35 38 2c 30 30 30 20 77 72 29 0a 3d 3d 38 36  858,000 wr).==86
1400: 38 33 3d 3d 20 44 31 20 20 6d 69 73 73 65 73 3a  83== D1  misses:
1410: 20 20 20 20 20 20 20 20 35 2c 30 36 37 2c 30 36          5,067,06
1420: 33 20 20 28 20 20 33 2c 35 34 34 2c 32 37 38 20  3  (  3,544,278 
1430: 72 64 20 20 20 2b 20 20 20 31 2c 35 32 32 2c 37  rd   +   1,522,7
1440: 38 35 20 77 72 29 0a 3d 3d 38 36 38 33 3d 3d 20  85 wr).==8683== 
1450: 4c 4c 64 20 6d 69 73 73 65 73 3a 20 20 20 20 20  LLd misses:     
1460: 20 20 20 20 20 20 35 37 2c 39 35 38 20 20 28 20        57,958  ( 
1470: 20 20 20 20 31 36 2c 30 36 37 20 72 64 20 20 20      16,067 rd   
1480: 2b 20 20 20 20 20 20 34 31 2c 38 39 31 20 77 72  +      41,891 wr
1490: 29 0a 3d 3d 38 36 38 33 3d 3d 20 44 31 20 20 6d  ).==8683== D1  m
14a0: 69 73 73 20 72 61 74 65 3a 20 20 20 20 20 20 20  iss rate:       
14b0: 20 20 20 20 30 2e 39 25 20 28 20 20 20 20 20 20      0.9% (      
14c0: 20 20 31 2e 30 25 20 20 20 20 20 2b 20 20 20 20    1.0%     +    
14d0: 20 20 20 20 20 30 2e 38 25 20 20 29 0a 3d 3d 38       0.8%  ).==8
14e0: 36 38 33 3d 3d 20 4c 4c 64 20 6d 69 73 73 20 72  683== LLd miss r
14f0: 61 74 65 3a 20 20 20 20 20 20 20 20 20 20 20 30  ate:           0
1500: 2e 30 25 20 28 20 20 20 20 20 20 20 20 30 2e 30  .0% (        0.0
1510: 25 20 20 20 20 20 2b 20 20 20 20 20 20 20 20 20  %     +         
1520: 30 2e 30 25 20 20 29 0a 3d 3d 38 36 38 33 3d 3d  0.0%  ).==8683==
1530: 20 0a 3d 3d 38 36 38 33 3d 3d 20 4c 4c 20 72 65   .==8683== LL re
1540: 66 73 3a 20 20 20 20 20 20 20 20 20 20 32 38 2c  fs:          28,
1550: 37 39 38 2c 33 30 39 20 20 28 20 32 37 2c 32 37  798,309  ( 27,27
1560: 35 2c 35 32 34 20 72 64 20 20 20 2b 20 20 20 31  5,524 rd   +   1
1570: 2c 35 32 32 2c 37 38 35 20 77 72 29 0a 3d 3d 38  ,522,785 wr).==8
1580: 36 38 33 3d 3d 20 4c 4c 20 6d 69 73 73 65 73 3a  683== LL misses:
1590: 20 20 20 20 20 20 20 20 20 20 20 20 36 33 2c 31              63,1
15a0: 33 34 20 20 28 20 20 20 20 20 32 31 2c 32 34 33  34  (     21,243
15b0: 20 72 64 20 20 20 2b 20 20 20 20 20 20 34 31 2c   rd   +      41,
15c0: 38 39 31 20 77 72 29 0a 3d 3d 38 36 38 33 3d 3d  891 wr).==8683==
15d0: 20 4c 4c 20 6d 69 73 73 20 72 61 74 65 3a 20 20   LL miss rate:  
15e0: 20 20 20 20 20 20 20 20 20 20 30 2e 30 25 20 28            0.0% (
15f0: 20 20 20 20 20 20 20 20 30 2e 30 25 20 20 20 20          0.0%    
1600: 20 2b 20 20 20 20 20 20 20 20 20 30 2e 30 25 20   +         0.0% 
1610: 20 29 0a 20 20 20 74 65 78 74 09 20 20 20 64 61   ).   text.   da
1620: 74 61 09 20 20 20 20 62 73 73 09 20 20 20 20 64  ta.    bss.    d
1630: 65 63 09 20 20 20 20 68 65 78 09 66 69 6c 65 6e  ec.    hex.filen
1640: 61 6d 65 0a 20 35 32 33 30 34 34 09 20 20 20 38  ame. 523044.   8
1650: 32 34 30 09 20 20 20 31 39 37 36 09 20 3c 66 6f  240.   1976. <fo
1660: 6e 74 20 63 6f 6c 6f 72 3d 22 72 65 64 22 3e 35  nt color="red">5
1670: 33 33 32 36 30 3c 2f 66 6f 6e 74 3e 09 20 20 38  33260</font>.  8
1680: 32 33 30 63 09 73 71 6c 69 74 65 33 2e 6f 0a 20  230c.sqlite3.o. 
1690: 32 32 30 35 30 37 20 31 30 30 37 38 37 30 20 37  220507 1007870 7
16a0: 37 36 39 33 35 32 20 73 71 6c 69 74 65 33 2e 63  769352 sqlite3.c
16b0: 0a 3c 2f 70 72 65 3e 3c 2f 62 6c 6f 63 6b 71 75  .</pre></blockqu
16c0: 6f 74 65 3e 0a 0a 3c 70 3e 54 68 65 20 69 6d 70  ote>..<p>The imp
16d0: 6f 72 74 61 6e 74 20 70 61 72 74 73 20 6f 66 20  ortant parts of 
16e0: 74 68 65 20 6f 75 74 70 75 74 20 28 74 68 65 20  the output (the 
16f0: 70 61 72 74 73 20 74 68 61 74 20 74 68 65 20 64  parts that the d
1700: 65 76 65 6c 6f 70 65 72 73 20 70 61 79 0a 74 68  evelopers pay.th
1710: 65 20 6d 6f 73 74 20 61 74 74 65 6e 74 69 6f 6e  e most attention
1720: 20 74 6f 29 20 61 72 65 20 73 68 6f 77 6e 20 69   to) are shown i
1730: 6e 20 72 65 64 2e 0a 42 61 73 69 63 61 6c 6c 79  n red..Basically
1740: 2c 20 74 68 65 20 64 65 76 65 6c 6f 70 65 72 73  , the developers
1750: 20 77 61 6e 74 20 74 6f 20 6b 6e 6f 77 20 74 68   want to know th
1760: 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 63 6f  e size of the co
1770: 6d 70 69 6c 65 64 20 53 51 4c 69 74 65 0a 6c 69  mpiled SQLite.li
1780: 62 72 61 72 79 20 61 6e 64 20 68 6f 77 20 6d 61  brary and how ma
1790: 6e 79 20 43 50 55 20 63 79 63 6c 65 73 20 77 65  ny CPU cycles we
17a0: 72 65 20 6e 65 65 64 65 64 20 74 6f 20 72 75 6e  re needed to run
17b0: 20 74 68 65 20 70 65 72 66 6f 72 6d 61 6e 63 65   the performance
17c0: 20 74 65 73 74 2e 0a 0a 3c 70 3e 54 68 65 20 6f   test...<p>The o
17d0: 75 74 70 75 74 20 66 72 6f 6d 20 74 68 65 20 0a  utput from the .
17e0: 5b 68 74 74 70 73 3a 2f 2f 73 71 6c 69 74 65 2e  [https://sqlite.
17f0: 6f 72 67 2f 73 72 63 2f 66 69 6c 65 2f 74 6f 6f  org/src/file/too
1800: 6c 2f 63 67 5f 61 6e 6e 6f 2e 74 63 6c 20 7c 20  l/cg_anno.tcl | 
1810: 63 67 5f 61 6e 6e 6f 2e 74 63 6c 5d 20 73 63 72  cg_anno.tcl] scr
1820: 69 70 74 0a 73 68 6f 77 73 20 74 68 65 20 6e 75  ipt.shows the nu
1830: 6d 62 65 72 20 6f 66 20 43 50 55 20 63 79 63 6c  mber of CPU cycl
1840: 65 73 20 73 70 65 6e 74 20 6f 6e 20 65 61 63 68  es spent on each
1850: 20 6c 69 6e 65 20 6f 66 20 63 6f 64 65 2e 0a 54   line of code..T
1860: 68 65 20 72 65 70 6f 72 74 20 69 73 20 61 70 70  he report is app
1870: 72 6f 78 69 6d 61 74 65 6c 79 20 38 30 2c 30 30  roximately 80,00
1880: 30 20 6c 69 6e 65 73 20 6c 6f 6e 67 2e 20 20 54  0 lines long.  T
1890: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 73 20  he following is 
18a0: 61 20 62 72 69 65 66 0a 73 6e 69 70 70 65 74 20  a brief.snippet 
18b0: 74 61 6b 65 6e 20 66 72 6f 6d 20 74 68 65 20 6d  taken from the m
18c0: 69 64 64 6c 65 20 6f 66 20 74 68 65 20 72 65 70  iddle of the rep
18d0: 6f 72 74 20 74 6f 20 73 68 6f 77 20 77 68 61 74  ort to show what
18e0: 20 69 74 20 6c 6f 6f 6b 73 20 6c 69 6b 65 3a 0a   it looks like:.
18f0: 0a 3c 62 6c 6f 63 6b 71 75 6f 74 65 3e 3c 70 72  .<blockquote><pr
1900: 65 3e 0a 20 20 20 20 20 20 20 20 20 2e 20 20 53  e>.         .  S
1910: 51 4c 49 54 45 5f 50 52 49 56 41 54 45 20 69 6e  QLITE_PRIVATE in
1920: 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 4e 65  t sqlite3BtreeNe
1930: 78 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  xt(BtCursor *pCu
1940: 72 2c 20 69 6e 74 20 2a 70 52 65 73 29 7b 0a 20  r, int *pRes){. 
1950: 20 20 20 20 20 20 20 20 2e 20 20 20 20 4d 65 6d          .    Mem
1960: 50 61 67 65 20 2a 70 50 61 67 65 3b 0a 20 20 20  Page *pPage;.   
1970: 20 20 20 20 20 20 2e 20 20 20 20 61 73 73 65 72        .    asser
1980: 74 28 20 63 75 72 73 6f 72 4f 77 6e 73 42 74 53  t( cursorOwnsBtS
1990: 68 61 72 65 64 28 70 43 75 72 29 20 29 3b 0a 20  hared(pCur) );. 
19a0: 20 20 20 20 20 20 20 20 2e 20 20 20 20 61 73 73          .    ass
19b0: 65 72 74 28 20 70 52 65 73 21 3d 30 20 29 3b 0a  ert( pRes!=0 );.
19c0: 20 20 20 20 20 20 20 20 20 2e 20 20 20 20 61 73           .    as
19d0: 73 65 72 74 28 20 2a 70 52 65 73 3d 3d 30 20 7c  sert( *pRes==0 |
19e0: 7c 20 2a 70 52 65 73 3d 3d 31 20 29 3b 0a 20 20  | *pRes==1 );.  
19f0: 20 20 20 20 20 20 20 2e 20 20 20 20 61 73 73 65         .    asse
1a00: 72 74 28 20 70 43 75 72 2d 26 67 74 3b 73 6b 69  rt( pCur-&gt;ski
1a10: 70 4e 65 78 74 3d 3d 30 20 7c 7c 20 70 43 75 72  pNext==0 || pCur
1a20: 2d 26 67 74 3b 65 53 74 61 74 65 21 3d 43 55 52  -&gt;eState!=CUR
1a30: 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 20  SOR_VALID );.   
1a40: 33 36 39 2c 36 34 38 20 20 20 20 70 43 75 72 2d  369,648    pCur-
1a50: 26 67 74 3b 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d  &gt;info.nSize =
1a60: 20 30 3b 0a 20 20 20 33 36 39 2c 36 34 38 20 20   0;.   369,648  
1a70: 20 20 70 43 75 72 2d 26 67 74 3b 63 75 72 46 6c    pCur-&gt;curFl
1a80: 61 67 73 20 26 61 6d 70 3b 3d 20 7e 28 42 54 43  ags &amp;= ~(BTC
1a90: 46 5f 56 61 6c 69 64 4e 4b 65 79 7c 42 54 43 46  F_ValidNKey|BTCF
1aa0: 5f 56 61 6c 69 64 4f 76 66 6c 29 3b 0a 20 20 20  _ValidOvfl);.   
1ab0: 33 36 39 2c 36 34 38 20 20 20 20 2a 70 52 65 73  369,648    *pRes
1ac0: 20 3d 20 30 3b 0a 20 20 20 37 33 39 2c 32 39 36   = 0;.   739,296
1ad0: 20 20 20 20 69 66 28 20 70 43 75 72 2d 26 67 74      if( pCur-&gt
1ae0: 3b 65 53 74 61 74 65 21 3d 43 55 52 53 4f 52 5f  ;eState!=CURSOR_
1af0: 56 41 4c 49 44 20 29 20 72 65 74 75 72 6e 20 62  VALID ) return b
1b00: 74 72 65 65 4e 65 78 74 28 70 43 75 72 2c 20 70  treeNext(pCur, p
1b10: 52 65 73 29 3b 0a 20 31 2c 34 37 33 2c 35 38 30  Res);. 1,473,580
1b20: 20 20 20 20 70 50 61 67 65 20 3d 20 70 43 75 72      pPage = pCur
1b30: 2d 26 67 74 3b 61 70 50 61 67 65 26 23 39 31 3b  -&gt;apPage&#91;
1b40: 70 43 75 72 2d 26 67 74 3b 69 50 61 67 65 26 23  pCur-&gt;iPage&#
1b50: 39 33 3b 3b 0a 20 31 2c 38 34 31 2c 39 37 35 20  93;;. 1,841,975 
1b60: 20 20 20 69 66 28 20 28 2b 2b 70 43 75 72 2d 26     if( (++pCur-&
1b70: 67 74 3b 61 69 49 64 78 26 23 39 31 3b 70 43 75  gt;aiIdx&#91;pCu
1b80: 72 2d 26 67 74 3b 69 50 61 67 65 26 23 39 33 3b  r-&gt;iPage&#93;
1b90: 29 26 67 74 3b 3d 70 50 61 67 65 2d 26 67 74 3b  )&gt;=pPage-&gt;
1ba0: 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20 20 34 2c  nCell ){.     4,
1bb0: 33 34 30 20 20 20 20 20 20 70 43 75 72 2d 26 67  340      pCur-&g
1bc0: 74 3b 61 69 49 64 78 26 23 39 31 3b 70 43 75 72  t;aiIdx&#91;pCur
1bd0: 2d 26 67 74 3b 69 50 61 67 65 26 23 39 33 3b 2d  -&gt;iPage&#93;-
1be0: 2d 3b 0a 20 20 20 20 20 35 2c 35 39 33 20 20 20  -;.     5,593   
1bf0: 20 20 20 72 65 74 75 72 6e 20 62 74 72 65 65 4e     return btreeN
1c00: 65 78 74 28 70 43 75 72 2c 20 70 52 65 73 29 3b  ext(pCur, pRes);
1c10: 0a 20 20 20 20 20 20 20 20 20 2e 20 20 20 20 7d  .         .    }
1c20: 0a 20 20 20 37 32 38 2c 31 31 30 20 20 20 20 69  .   728,110    i
1c30: 66 28 20 70 50 61 67 65 2d 26 67 74 3b 6c 65 61  f( pPage-&gt;lea
1c40: 66 20 29 7b 0a 20 20 20 20 20 20 20 20 20 2e 20  f ){.         . 
1c50: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
1c60: 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 20  TE_OK;.         
1c70: 2e 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
1c80: 20 33 2c 31 31 37 20 20 20 20 20 20 72 65 74 75   3,117      retu
1c90: 72 6e 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73  rn moveToLeftmos
1ca0: 74 28 70 43 75 72 29 3b 0a 20 20 20 20 20 20 20  t(pCur);.       
1cb0: 20 20 2e 20 20 20 20 7d 0a 20 20 20 37 32 31 2c    .    }.   721,
1cc0: 38 37 36 20 20 7d 0a 3c 2f 70 72 65 3e 3c 2f 62  876  }.</pre></b
1cd0: 6c 6f 63 6b 71 75 6f 74 65 3e 0a 0a 3c 70 3e 0a  lockquote>..<p>.
1ce0: 54 68 65 20 6e 75 6d 62 65 72 73 20 6f 6e 20 74  The numbers on t
1cf0: 68 65 20 6c 65 66 74 20 61 72 65 20 74 68 65 20  he left are the 
1d00: 43 50 55 20 63 79 63 6c 65 20 63 6f 75 6e 74 73  CPU cycle counts
1d10: 20 66 6f 72 20 74 68 61 74 20 6c 69 6e 65 20 6f   for that line o
1d20: 66 20 63 6f 64 65 2c 0a 6f 66 20 63 6f 75 72 73  f code,.of cours
1d30: 65 2e 0a 0a 3c 70 3e 0a 54 68 65 20 63 67 5f 61  e...<p>.The cg_a
1d40: 6e 6e 6f 2e 74 63 6c 20 73 63 72 69 70 74 20 72  nno.tcl script r
1d50: 65 6d 6f 76 65 73 20 65 78 74 72 61 6e 65 6f 75  emoves extraneou
1d60: 73 20 64 65 74 61 69 6c 73 20 66 72 6f 6d 20 74  s details from t
1d70: 68 65 20 64 65 66 61 75 6c 74 20 0a 63 61 63 68  he default .cach
1d80: 65 67 72 69 6e 64 20 61 6e 6e 6f 74 61 74 69 6f  egrind annotatio
1d90: 6e 0a 6f 75 74 70 75 74 20 73 6f 20 74 68 61 74  n.output so that
1da0: 20 62 65 66 6f 72 65 2d 61 6e 64 2d 61 66 74 65   before-and-afte
1db0: 72 20 72 65 70 6f 72 74 73 20 63 61 6e 20 62 65  r reports can be
1dc0: 20 63 6f 6d 70 61 72 65 64 20 75 73 69 6e 67 20   compared using 
1dd0: 61 20 0a 73 69 64 65 2d 62 79 2d 73 69 64 65 20  a .side-by-side 
1de0: 64 69 66 66 20 74 6f 20 76 69 65 77 20 73 70 65  diff to view spe
1df0: 63 69 66 69 63 20 64 65 74 61 69 6c 73 20 6f 66  cific details of
1e00: 20 68 6f 77 20 61 0a 6d 69 63 72 6f 2d 6f 70 74   how a.micro-opt
1e10: 69 6d 69 7a 61 74 69 6f 6e 20 61 74 74 65 6d 70  imization attemp
1e20: 74 20 61 66 66 65 63 74 65 64 20 70 65 72 66 6f  t affected perfo
1e30: 72 6d 61 6e 63 65 2e 0a 0a 0a 3c 68 31 3e 4c 69  rmance....<h1>Li
1e40: 6d 69 74 61 74 69 6f 6e 73 3c 2f 68 31 3e 0a 0a  mitations</h1>..
1e50: 3c 70 3e 54 68 65 20 75 73 65 20 6f 66 20 74 68  <p>The use of th
1e60: 65 20 73 74 61 6e 64 61 72 64 69 7a 65 64 20 73  e standardized s
1e70: 70 65 65 64 74 65 73 74 31 2e 63 20 77 6f 72 6b  peedtest1.c work
1e80: 6c 6f 61 64 20 61 6e 64 20 63 61 63 68 65 67 72  load and cachegr
1e90: 69 6e 64 20 68 61 73 0a 65 6e 61 62 6c 65 64 20  ind has.enabled 
1ea0: 73 69 67 6e 69 66 69 63 61 6e 74 20 70 65 72 66  significant perf
1eb0: 6f 72 6d 61 6e 63 65 20 69 6d 70 72 6f 76 65 6d  ormance improvem
1ec0: 65 6e 74 2e 0a 48 6f 77 65 76 65 72 2c 20 69 74  ent..However, it
1ed0: 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 20 74 6f   is important to
1ee0: 20 72 65 63 6f 67 6e 69 7a 65 20 74 68 65 20 6c   recognize the l
1ef0: 69 6d 69 74 61 74 69 6f 6e 73 20 6f 66 20 74 68  imitations of th
1f00: 69 73 20 61 70 70 72 6f 61 63 68 3a 0a 0a 3c 75  is approach:..<u
1f10: 6c 3e 0a 3c 6c 69 3e 3c 70 3e 0a 50 65 72 66 6f  l>.<li><p>.Perfo
1f20: 72 6d 61 6e 63 65 20 6d 65 61 73 75 72 65 6d 65  rmance measureme
1f30: 6e 74 73 20 61 72 65 20 64 6f 6e 65 20 77 69 74  nts are done wit
1f40: 68 20 61 20 73 69 6e 67 6c 65 20 63 6f 6d 70 69  h a single compi
1f50: 6c 65 72 20 28 67 63 63 20 35 2e 34 2e 30 29 2c  ler (gcc 5.4.0),
1f60: 0a 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 73 65  .optimization se
1f70: 74 74 69 6e 67 20 28 2d 4f 73 29 2c 20 61 6e 64  tting (-Os), and
1f80: 0a 6f 6e 20 61 20 73 69 6e 67 6c 65 20 70 6c 61  .on a single pla
1f90: 74 66 6f 72 6d 20 28 55 62 75 6e 74 75 20 31 36  tform (Ubuntu 16
1fa0: 2e 30 34 20 4c 54 53 20 6f 6e 20 78 36 34 29 2e  .04 LTS on x64).
1fb0: 20 20 54 68 65 20 70 65 72 66 6f 72 6d 61 6e 63    The performanc
1fc0: 65 20 6f 66 0a 6f 74 68 65 72 20 63 6f 6d 70 69  e of.other compi
1fd0: 6c 65 72 73 20 61 6e 64 20 70 72 6f 63 65 73 73  lers and process
1fe0: 6f 72 73 20 6d 61 79 20 76 61 72 79 2e 0a 0a 3c  ors may vary...<
1ff0: 6c 69 3e 3c 70 3e 0a 54 68 65 20 73 70 65 65 64  li><p>.The speed
2000: 74 65 73 74 31 2e 63 20 77 6f 72 6b 6c 6f 61 64  test1.c workload
2010: 20 74 68 61 74 20 69 73 20 62 65 69 6e 67 20 6d   that is being m
2020: 65 61 73 75 72 65 64 20 74 72 69 65 73 20 74 6f  easured tries to
2030: 20 62 65 20 72 65 70 72 65 73 65 6e 74 61 74 69   be representati
2040: 76 65 0a 6f 66 20 61 20 77 69 64 65 20 72 61 6e  ve.of a wide ran
2050: 67 65 20 6f 66 20 74 79 70 69 63 61 6c 20 75 73  ge of typical us
2060: 65 73 20 6f 66 20 53 51 4c 69 74 65 2e 20 20 42  es of SQLite.  B
2070: 75 74 20 65 76 65 72 79 20 61 70 70 6c 69 63 61  ut every applica
2080: 74 69 6f 6e 20 69 73 0a 64 69 66 66 65 72 65 6e  tion is.differen
2090: 74 2e 20 20 54 68 65 20 73 70 65 65 64 74 65 73  t.  The speedtes
20a0: 74 31 2e 63 20 77 6f 72 6b 6c 6f 61 64 20 6d 69  t1.c workload mi
20b0: 67 68 74 20 6e 6f 74 20 62 65 20 61 20 67 6f 6f  ght not be a goo
20c0: 64 20 70 72 6f 78 79 20 66 6f 72 20 74 68 65 0a  d proxy for the.
20d0: 6b 69 6e 64 73 20 6f 66 20 61 63 74 69 76 69 74  kinds of activit
20e0: 69 65 73 20 70 65 72 66 6f 72 6d 65 64 20 62 79  ies performed by
20f0: 20 73 6f 6d 65 20 61 70 70 6c 69 63 61 74 69 6f   some applicatio
2100: 6e 73 2e 20 20 54 68 65 20 53 51 4c 69 74 65 20  ns.  The SQLite 
2110: 64 65 76 65 6c 6f 70 65 72 73 0a 61 72 65 20 63  developers.are c
2120: 6f 6e 73 74 61 6e 74 6c 79 20 77 6f 72 6b 69 6e  onstantly workin
2130: 67 20 74 6f 20 69 6d 70 72 6f 76 65 20 74 68 65  g to improve the
2140: 20 73 70 65 65 64 74 65 73 74 31 2e 63 20 70 72   speedtest1.c pr
2150: 6f 67 72 61 6d 2c 20 74 6f 20 6d 61 6b 65 20 69  ogram, to make i
2160: 74 0a 61 20 62 65 74 74 65 72 20 70 72 6f 78 79  t.a better proxy
2170: 20 66 6f 72 20 61 63 74 75 61 6c 20 53 51 4c 69   for actual SQLi
2180: 74 65 20 75 73 61 67 65 2e 20 20 43 6f 6d 6d 75  te usage.  Commu
2190: 6e 69 74 79 20 66 65 65 64 62 61 63 6b 20 69 73  nity feedback is
21a0: 20 77 65 6c 63 6f 6d 65 64 2e 0a 0a 3c 6c 69 3e   welcomed...<li>
21b0: 3c 70 3e 0a 54 68 65 20 63 79 63 6c 65 20 63 6f  <p>.The cycle co
21c0: 75 6e 74 73 20 70 72 6f 76 69 64 65 64 20 62 79  unts provided by
21d0: 20 63 61 63 68 65 67 72 69 6e 64 20 61 72 65 20   cachegrind are 
21e0: 61 20 67 6f 6f 64 20 70 72 6f 78 79 20 66 6f 72  a good proxy for
21f0: 20 61 63 74 75 61 6c 0a 70 65 72 66 6f 72 6d 61   actual.performa
2200: 6e 63 65 2c 20 62 75 74 20 74 68 65 79 20 61 72  nce, but they ar
2210: 65 20 6e 6f 74 20 31 30 30 25 20 61 63 63 75 72  e not 100% accur
2220: 61 74 65 2e 0a 0a 3c 6c 69 3e 3c 70 3e 0a 4f 6e  ate...<li><p>.On
2230: 6c 79 20 43 50 55 20 63 79 63 6c 65 20 63 6f 75  ly CPU cycle cou
2240: 6e 74 73 20 61 72 65 20 62 65 69 6e 67 20 6d 65  nts are being me
2250: 61 73 75 72 65 64 20 68 65 72 65 2e 20 0a 43 50  asured here. .CP
2260: 55 20 63 79 63 6c 65 20 63 6f 75 6e 74 73 20 61  U cycle counts a
2270: 72 65 20 61 20 67 6f 6f 64 20 70 72 6f 78 79 20  re a good proxy 
2280: 66 6f 72 20 65 6e 65 72 67 79 20 63 6f 6e 73 75  for energy consu
2290: 6d 70 74 69 6f 6e 2c 0a 62 75 74 20 64 6f 20 6e  mption,.but do n
22a0: 6f 74 20 6e 65 63 65 73 73 61 72 79 20 63 6f 72  ot necessary cor
22b0: 72 65 6c 61 74 65 20 77 65 6c 6c 20 77 69 74 68  relate well with
22c0: 20 72 65 61 6c 2d 77 6f 72 6c 64 20 74 69 6d 69   real-world timi
22d0: 6e 67 73 2e 0a 54 69 6d 65 20 73 70 65 6e 74 20  ngs..Time spent 
22e0: 64 6f 69 6e 67 20 49 2f 4f 20 69 73 20 6e 6f 74  doing I/O is not
22f0: 20 72 65 66 6c 65 63 74 65 64 20 69 6e 20 74 68   reflected in th
2300: 65 20 43 50 55 20 63 79 63 6c 65 20 63 6f 75 6e  e CPU cycle coun
2310: 74 73 2c 0a 61 6e 64 20 49 2f 4f 20 74 69 6d 65  ts,.and I/O time
2320: 20 70 72 65 64 6f 6d 69 6e 61 74 65 73 20 69 6e   predominates in
2330: 20 6d 61 6e 79 20 53 51 4c 69 74 65 20 75 73 61   many SQLite usa
2340: 67 65 20 73 63 65 6e 61 72 69 6f 73 2e 0a 3c 2f  ge scenarios..</
2350: 75 6c 3e 0a                                      ul>.