]> git.ipfire.org Git - thirdparty/sqlite.git/commitdiff
Speed improvements as described by tickets #1257 and #1258. These changes
authordrh <drh@noemail.net>
Sat, 21 May 2005 18:32:18 +0000 (18:32 +0000)
committerdrh <drh@noemail.net>
Sat, 21 May 2005 18:32:18 +0000 (18:32 +0000)
help some but are nowhere near the 23% claimed in the tickets. (CVS 2469)

FossilOrigin-Name: 3fa177c54a8589dcfa0bfad0ca124cb73b363f18

manifest
manifest.uuid
src/vdbeaux.c

index 5b827f2f98ac19d5ac5eac938fbad50143b3c662..d3fc7d02d9dbc020905bbc81d87169f371d7ccf2 100644 (file)
--- 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
index aefc7f747e17757b4bfbb6fe89efa557ce4a9c42..4e1fea16d503a6b307fca7ff9c60fa0fec752945 100644 (file)
@@ -1 +1 @@
-6b6e525b294a5bbf8a5e56a2f60aa096865aedbd
\ No newline at end of file
+3fa177c54a8589dcfa0bfad0ca124cb73b363f18
\ No newline at end of file
index 9e6c9ba01aefa3886740362f9e748e250c63ae7b..7ed08d45d019f7c96e859c508492b50a2cb8faaa 100644 (file)
@@ -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; n<len; n++){
-        v = (v<<8) | buf[n];
-      }
+  switch( serial_type ){
+    case 8:    /* Reserved for future use */
+    case 9:    /* Reserved for future use */
+    case 10:   /* Reserved for future use */
+    case 11:   /* Reserved for future use */
+    case 0: {  /* NULL */
+      pMem->flags = 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; n<len; n++){
-        v = (v<<8) | buf[n];
-      }
-      if( serial_type==7 ){
-        pMem->flags = 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, i<nField ? pKeyInfo->aColl[i] : 0);
-    sqlite3VdbeMemRelease(&mem1);
-    sqlite3VdbeMemRelease(&mem2);
+    if( mem1.flags & MEM_Dyn ) sqlite3VdbeMemRelease(&mem1);
+    if( mem2.flags & MEM_Dyn ) sqlite3VdbeMemRelease(&mem2);
     if( rc!=0 ){
       break;
     }