From 3c685821889dc31da517ba77c5dbdcf12542532e Mon Sep 17 00:00:00 2001 From: drh Date: Sat, 21 May 2005 18:32:18 +0000 Subject: [PATCH] Speed improvements as described by tickets #1257 and #1258. These changes help some but are nowhere near the 23% claimed in the tickets. (CVS 2469) FossilOrigin-Name: 3fa177c54a8589dcfa0bfad0ca124cb73b363f18 --- manifest | 12 +++--- manifest.uuid | 2 +- src/vdbeaux.c | 112 +++++++++++++++++++++++++++----------------------- 3 files changed, 68 insertions(+), 58 deletions(-) diff --git a/manifest b/manifest index 5b827f2f98..d3fc7d02d9 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C More\sstructure\srearrangements\sfor\sadditional\ssize\sreductions.\s\sTicket\s#1253.\s(CVS\s2468) -D 2005-05-21T02:48:09 +C Speed\simprovements\sas\sdescribed\sby\stickets\s#1257\sand\s#1258.\s\sThese\schanges\nhelp\ssome\sbut\sare\snowhere\snear\sthe\s23%\sclaimed\sin\sthe\stickets.\s(CVS\s2469) +D 2005-05-21T18:32:19 F Makefile.in 5c00d0037104de2a50ac7647a5f12769795957a3 F Makefile.linux-gcc 06be33b2a9ad4f005a5f42b22c4a19dab3cbb5c7 F README 9c4e2d6706bdcc3efdd773ce752a8cdab4f90028 @@ -79,7 +79,7 @@ F src/vdbe.c d2574042c44baf6b1016c61e8072dec529ac748a F src/vdbe.h 75e466d84d362b0c4498978a9d6b1e6bd32ecf3b F src/vdbeInt.h 4afaae2f4adcab54ad2a40dabb2e689fba7b1561 F src/vdbeapi.c c66b88fce58f72eee44ec8c348a2561e031d2417 -F src/vdbeaux.c 77dc2e0f8e846269c51342134f3c9720f51707e6 +F src/vdbeaux.c 78704946502cac6ebf6805ccc9239e4ff0e56fe7 F src/vdbemem.c 4e853ce3151eaf7906150da85a1b3ce1fe5e8da8 F src/where.c f02baff03e2a9ed7bdc36b363b8e4024a94de919 F tclinstaller.tcl 046e3624671962dc50f0481d7c25b38ef803eb42 @@ -279,7 +279,7 @@ F www/tclsqlite.tcl 425be741b8ae664f55cb1ef2371aab0a75109cf9 F www/vdbe.tcl 87a31ace769f20d3627a64fa1fade7fed47b90d0 F www/version3.tcl a99cf5f6d8bd4d5537584a2b342f0fb9fa601d8b F www/whentouse.tcl 528299b8316726dbcc5548e9aa0648c8b1bd055b -P 27025613bc2970b0c23e08fbe5251103794ab6cb -R 117e33923c7b5da1df58206a9a2755b5 +P 6b6e525b294a5bbf8a5e56a2f60aa096865aedbd +R 042677df90186a621c94e43c5acba4cf U drh -Z e67191b0113ddab8b656fe220932b386 +Z 324f7899fb27d4525e3b990fa6bc19dc diff --git a/manifest.uuid b/manifest.uuid index aefc7f747e..4e1fea16d5 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -6b6e525b294a5bbf8a5e56a2f60aa096865aedbd \ No newline at end of file +3fa177c54a8589dcfa0bfad0ca124cb73b363f18 \ No newline at end of file diff --git a/src/vdbeaux.c b/src/vdbeaux.c index 9e6c9ba01a..7ed08d45d0 100644 --- a/src/vdbeaux.c +++ b/src/vdbeaux.c @@ -1688,61 +1688,71 @@ int sqlite3VdbeSerialGet( u32 serial_type, /* Serial type to deserialize */ Mem *pMem /* Memory cell to write value into */ ){ - int len; - - if( serial_type==0 ){ - /* NULL */ - pMem->flags = MEM_Null; - return 0; - } - len = sqlite3VdbeSerialTypeLen(serial_type); - if( serial_type<=7 ){ - /* Integer and Real */ - if( serial_type<=4 ){ - /* 32-bit integer type. This is handled by a special case for - ** performance reasons. */ - int v = buf[0]; - int n; - if( v&0x80 ){ - v |= -256; - } - for(n=1; nflags = MEM_Null; + break; + } + case 1: { /* 1-byte signed integer */ + pMem->i = (signed char)buf[0]; pMem->flags = MEM_Int; - pMem->i = v; - return n; - }else{ - u64 v = 0; - int n; - - if( buf[0]&0x80 ){ - v = -1; - } - for(n=0; nflags = MEM_Real; - pMem->r = *(double*)&v; - }else{ + return 1; + } + case 2: { /* 2-byte signed integer */ + pMem->i = (((signed char)buf[0])<<8) | buf[1]; + pMem->flags = MEM_Int; + return 2; + } + case 3: { /* 3-byte signed integer */ + pMem->i = (((signed char)buf[0])<<16) | (buf[1]<<8) | buf[2]; + pMem->flags = MEM_Int; + return 3; + } + case 4: { /* 4-byte signed integer */ + pMem->i = (buf[0]<<24) | (buf[1]<<16) | (buf[2]<<8) | buf[3]; + pMem->flags = MEM_Int; + return 4; + } + case 5: { /* 6-byte signed integer */ + u64 x = (((signed char)buf[0])<<8) | buf[1]; + u32 y = (buf[2]<<24) | (buf[3]<<16) | (buf[4]<<8) | buf[5]; + x = (x<<32) | y; + pMem->i = *(i64*)&x; + pMem->flags = MEM_Int; + return 6; + } + case 6: /* 6-byte signed integer */ + case 7: { /* IEEE floating point */ + u64 x = (buf[0]<<24) | (buf[1]<<16) | (buf[2]<<8) | buf[3]; + u32 y = (buf[4]<<24) | (buf[5]<<16) | (buf[6]<<8) | buf[7]; + x = (x<<32) | y; + if( serial_type==6 ){ + pMem->i = *(i64*)&x; pMem->flags = MEM_Int; - pMem->i = *(i64*)&v; + }else{ + pMem->r = *(double*)&x; + pMem->flags = MEM_Real; } + return 8; } - }else{ - /* String or blob */ - assert( serial_type>=12 ); - pMem->z = (char *)buf; - pMem->n = len; - pMem->xDel = 0; - if( serial_type&0x01 ){ - pMem->flags = MEM_Str | MEM_Ephem; - }else{ - pMem->flags = MEM_Blob | MEM_Ephem; + default: { + int len = (serial_type-12)/2; + pMem->z = (char *)buf; + pMem->n = len; + pMem->xDel = 0; + if( serial_type&0x01 ){ + pMem->flags = MEM_Str | MEM_Ephem; + }else{ + pMem->flags = MEM_Blob | MEM_Ephem; + } + return len; } } - return len; + return 0; } /* @@ -1796,8 +1806,8 @@ int sqlite3VdbeRecordCompare( d2 += sqlite3VdbeSerialGet(&aKey2[d2], serial_type2, &mem2); rc = sqlite3MemCompare(&mem1, &mem2, iaColl[i] : 0); - sqlite3VdbeMemRelease(&mem1); - sqlite3VdbeMemRelease(&mem2); + if( mem1.flags & MEM_Dyn ) sqlite3VdbeMemRelease(&mem1); + if( mem2.flags & MEM_Dyn ) sqlite3VdbeMemRelease(&mem2); if( rc!=0 ){ break; } -- 2.47.3