]> git.ipfire.org Git - thirdparty/sqlite.git/commitdiff
Use a lookup table to compute the content length for serial types less
authordrh <drh@noemail.net>
Fri, 16 Oct 2015 14:23:42 +0000 (14:23 +0000)
committerdrh <drh@noemail.net>
Fri, 16 Oct 2015 14:23:42 +0000 (14:23 +0000)
than 128, for a 1.2% performance improvement.

FossilOrigin-Name: 3395724814099d28829ef6875ca1ba77d6fe7ffa

manifest
manifest.uuid
src/vdbe.c
src/vdbeInt.h
src/vdbeaux.c

index 330945612557b33769e2abe49c9e8446277916dc..983c0f925029e1838b8fb14a116e048832842227 100644 (file)
--- a/manifest
+++ b/manifest
@@ -1,5 +1,5 @@
-C Simplify\sthe\sOP_Column\slogic\sslightly.\s\sOne\svery\ssmall\sperformance\s\nimprovement\sadded.
-D 2015-10-16T13:50:08.508
+C Use\sa\slookup\stable\sto\scompute\sthe\scontent\slength\sfor\sserial\stypes\sless\nthan\s128,\sfor\sa\s1.2%\sperformance\simprovement.
+D 2015-10-16T14:23:42.654
 F Makefile.in 2ea961bc09e441874eb3d1bf7398e04feb24f3ee
 F Makefile.linux-gcc 7bc79876b875010e8c8f9502eb935ca92aa3c434
 F Makefile.msc 8e42cb55739cd8c12e1fd25401956e2019448f6a
@@ -401,11 +401,11 @@ F src/update.c aa10336a2719bd1b9f89004f3d7ba6d566623a49
 F src/utf.c fc6b889ba0779b7722634cdeaa25f1930d93820c
 F src/util.c fc612367108b74573c5fd13a85d0a23027f438bd
 F src/vacuum.c 2ddd5cad2a7b9cef7f9e431b8c7771634c6b1701
-F src/vdbe.c 612bf3ee27cefb61ec9abf11c6499b57432cbc07
+F src/vdbe.c f84d2241bfe4f3a8f1a335055f2591552df7c0e0
 F src/vdbe.h 4bc88bd0e06f8046ee6ab7487c0015e85ad949ad
-F src/vdbeInt.h 8b867eac234e28627ffcace3cd4b4b79bbec664b
+F src/vdbeInt.h 5f813a198e825a219c192a624c92f8e7920a6367
 F src/vdbeapi.c 020681b943e77766b32ae1cddf86d7831b7374ca
-F src/vdbeaux.c fd00b489ab3f44f2dca1e4344faf289b7bfcf649
+F src/vdbeaux.c 0ba112687ba2f18cbf35c48133995754a49d0cba
 F src/vdbeblob.c 565fabd302f5fca3bdf3d56cac330483616a39b6
 F src/vdbemem.c 19b3036aa4d676e7103b0fb5efd6327da455f915
 F src/vdbesort.c 8b23930a1289526f6d2a3a9f2e965bcc963e4a68
@@ -1391,7 +1391,7 @@ F tool/vdbe_profile.tcl 246d0da094856d72d2c12efec03250d71639d19f
 F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4
 F tool/warnings.sh 48bd54594752d5be3337f12c72f28d2080cb630b
 F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f
-P 8125b74cb46c372b9a319f6270f1c396767accd7
-R f13372f71b8052ca27ec6a7d639132e9
+P 0114b45dc286c13db0d640f0486d8a5bef9ff078
+R 12cf1fe7ed1387197e4a847f05d985b3
 U drh
-Z 5438899bf7e61a76c862a84a5f7b0608
+Z b6119956bfc0b990e5772b0f41137f49
index 420bc28a51727b35d0f451f16396c00252e46a74..7bf4a17e7566ea9442a2eae19a0a6da5211be024 100644 (file)
@@ -1 +1 @@
-0114b45dc286c13db0d640f0486d8a5bef9ff078
\ No newline at end of file
+3395724814099d28829ef6875ca1ba77d6fe7ffa
\ No newline at end of file
index 2eab49c0bad8b41c517156b8207c31ebba6b90e8..35a152c72a8702d693eafb97ce9e5ca826005d31 100644 (file)
@@ -2369,7 +2369,6 @@ case OP_Column: {
   const u8 *zEndHdr; /* Pointer to first byte after the header */
   u32 offset;        /* Offset into the data */
   u64 offset64;      /* 64-bit offset */
-  u32 szField;       /* Number of bytes in the content of a field */
   u32 avail;         /* Number of bytes of available data */
   u32 t;             /* A type code from the record header */
   u16 fx;            /* pDest->flags value */
@@ -2500,13 +2499,12 @@ case OP_Column: {
       do{
         if( (t = zHdr[0])<0x80 ){
           zHdr++;
+          offset64 += sqlite3VdbeOneByteSerialTypeLen(t);
         }else{
           zHdr += sqlite3GetVarint32(zHdr, &t);
+          offset64 += sqlite3VdbeSerialTypeLen(t);
         }
-        pC->aType[i] = t;
-        szField = sqlite3VdbeSerialTypeLen(t);
-        offset64 += szField;
-        i++;
+        pC->aType[i++] = t;
         aOffset[i] = (u32)(offset64 & 0xffffffff);
       }while( i<=p2 && zHdr<zEndHdr );
       pC->nHdrParsed = i;
index 7884d955b01f53365f5fccef2d4f880ee880eaf9..fe1ea5ced355e6d632c92a6ee483b1a91cfca8ef 100644 (file)
@@ -412,6 +412,7 @@ int sqlite3VdbeCursorRestore(VdbeCursor*);
 void sqlite3VdbePrintOp(FILE*, int, Op*);
 #endif
 u32 sqlite3VdbeSerialTypeLen(u32);
+u8 sqlite3VdbeOneByteSerialTypeLen(u8);
 u32 sqlite3VdbeSerialType(Mem*, int);
 u32 sqlite3VdbeSerialPut(unsigned char*, Mem*, u32);
 u32 sqlite3VdbeSerialGet(const unsigned char*, u32, Mem*);
index 9fed69127a707c6a1b6f90f222c61272f20ac494..1223d82742dc09e94dabe919d9d22953baa31434 100644 (file)
@@ -2979,22 +2979,41 @@ u32 sqlite3VdbeSerialType(Mem *pMem, int file_format){
 }
 
 /*
-** The sizes for serial types less than 12
+** The sizes for serial types less than 128
 */
 static const u8 sqlite3SmallTypeSizes[] = {
-  0, 1, 2, 3, 4, 6, 8, 8, 0, 0, 0, 0
+        /*  0   1   2   3   4   5   6   7   8   9 */   
+/*   0 */   0,  1,  2,  3,  4,  6,  8,  8,  0,  0,
+/*  10 */   0,  0,  0,  0,  1,  1,  2,  2,  3,  3,
+/*  20 */   4,  4,  5,  5,  6,  6,  7,  7,  8,  8,
+/*  30 */   9,  9, 10, 10, 11, 11, 12, 12, 13, 13,
+/*  40 */  14, 14, 15, 15, 16, 16, 17, 17, 18, 18,
+/*  50 */  19, 19, 20, 20, 21, 21, 22, 22, 23, 23,
+/*  60 */  24, 24, 25, 25, 26, 26, 27, 27, 28, 28,
+/*  70 */  29, 29, 30, 30, 31, 31, 32, 32, 33, 33,
+/*  80 */  34, 34, 35, 35, 36, 36, 37, 37, 38, 38,
+/*  90 */  39, 39, 40, 40, 41, 41, 42, 42, 43, 43,
+/* 100 */  44, 44, 45, 45, 46, 46, 47, 47, 48, 48,
+/* 110 */  49, 49, 50, 50, 51, 51, 52, 52, 53, 53,
+/* 120 */  54, 54, 55, 55, 56, 56, 57, 57
 };
 
 /*
 ** Return the length of the data corresponding to the supplied serial-type.
 */
 u32 sqlite3VdbeSerialTypeLen(u32 serial_type){
-  if( serial_type>=12 ){
+  if( serial_type>=128 ){
     return (serial_type-12)/2;
   }else{
+    assert( serial_type<12 
+            || sqlite3SmallTypeSizes[serial_type]==(serial_type - 12)/2 );
     return sqlite3SmallTypeSizes[serial_type];
   }
 }
+u8 sqlite3VdbeOneByteSerialTypeLen(u8 serial_type){
+  assert( serial_type<128 );
+  return sqlite3SmallTypeSizes[serial_type];  
+}
 
 /*
 ** If we are on an architecture with mixed-endian floating