From: drh Date: Fri, 16 Oct 2015 14:23:42 +0000 (+0000) Subject: Use a lookup table to compute the content length for serial types less X-Git-Tag: version-3.10.0~221 X-Git-Url: http://git.ipfire.org/gitweb/gitweb.cgi?a=commitdiff_plain;h=faf3727904013084a74e784389c2fcb317494c02;p=thirdparty%2Fsqlite.git Use a lookup table to compute the content length for serial types less than 128, for a 1.2% performance improvement. FossilOrigin-Name: 3395724814099d28829ef6875ca1ba77d6fe7ffa --- diff --git a/manifest b/manifest index 3309456125..983c0f9250 100644 --- 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 diff --git a/manifest.uuid b/manifest.uuid index 420bc28a51..7bf4a17e75 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -0114b45dc286c13db0d640f0486d8a5bef9ff078 \ No newline at end of file +3395724814099d28829ef6875ca1ba77d6fe7ffa \ No newline at end of file diff --git a/src/vdbe.c b/src/vdbe.c index 2eab49c0ba..35a152c72a 100644 --- a/src/vdbe.c +++ b/src/vdbe.c @@ -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 && zHdrnHdrParsed = i; diff --git a/src/vdbeInt.h b/src/vdbeInt.h index 7884d955b0..fe1ea5ced3 100644 --- a/src/vdbeInt.h +++ b/src/vdbeInt.h @@ -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*); diff --git a/src/vdbeaux.c b/src/vdbeaux.c index 9fed69127a..1223d82742 100644 --- a/src/vdbeaux.c +++ b/src/vdbeaux.c @@ -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