]> git.saurik.com Git - redis.git/commitdiff
change iteration code to avoid allocating a new sds for each traversed entry
authorPieter Noordhuis <pcnoordhuis@gmail.com>
Fri, 21 May 2010 11:29:14 +0000 (13:29 +0200)
committerPieter Noordhuis <pcnoordhuis@gmail.com>
Sat, 29 May 2010 19:10:15 +0000 (21:10 +0200)
ziplist.c

index 112159ffa4f668c56228f2f268f4ba1eb7e92b7e..fefdbb7e64da52394bfc0bf808a04ccd50b935df 100644 (file)
--- a/ziplist.c
+++ b/ziplist.c
@@ -120,12 +120,11 @@ unsigned char *ziplistIndex(unsigned char *zl, unsigned int index) {
 
 /* Store entry at current position in sds *value and return pointer
  * to the next entry. */
 
 /* Store entry at current position in sds *value and return pointer
  * to the next entry. */
-unsigned char *ziplistNext(unsigned char *p, sds *value) {
+unsigned char *ziplistNext(unsigned char *p, unsigned char **entry, unsigned int *elen) {
     if (*p == ZIP_END) return NULL;
     if (*p == ZIP_END) return NULL;
-    if (value) {
-        unsigned int len;
-        len = zipDecodeLength(p);
-        *value = sdsnewlen(p+zipEncodeLength(NULL,len),len);
+    if (entry) {
+        *elen = zipDecodeLength(p);
+        *entry = p+ZIP_LEN_BYTES(*elen);
     }
     p += zipRawEntryLength(p);
     return p;
     }
     p += zipRawEntryLength(p);
     return p;
@@ -159,7 +158,8 @@ unsigned char *createList() {
 }
 
 int main(int argc, char **argv) {
 }
 
 int main(int argc, char **argv) {
-    unsigned char *zl, *p;
+    unsigned char *zl, *p, *entry;
+    unsigned int elen;
     sds s;
 
     zl = createList();
     sds s;
 
     zl = createList();
@@ -177,8 +177,10 @@ int main(int argc, char **argv) {
     {
         zl = createList();
         p = ziplistIndex(zl, 0);
     {
         zl = createList();
         p = ziplistIndex(zl, 0);
-        while ((p = ziplistNext(p, &s)) != NULL) {
-            printf("Entry: %s (length %ld)\n", s, sdslen(s));
+        while ((p = ziplistNext(p, &entry, &elen)) != NULL) {
+            printf("Entry: ");
+            fwrite(entry,elen,1,stdout);
+            printf(" (length %d)\n", elen);
         }
         printf("\n");
     }
         }
         printf("\n");
     }
@@ -187,8 +189,10 @@ int main(int argc, char **argv) {
     {
         zl = createList();
         p = ziplistIndex(zl, 1);
     {
         zl = createList();
         p = ziplistIndex(zl, 1);
-        while ((p = ziplistNext(p, &s)) != NULL) {
-            printf("Entry: %s (length %ld)\n", s, sdslen(s));
+        while ((p = ziplistNext(p, &entry, &elen)) != NULL) {
+            printf("Entry: ");
+            fwrite(entry,elen,1,stdout);
+            printf(" (length %d)\n", elen);
         }
         printf("\n");
     }
         }
         printf("\n");
     }
@@ -197,8 +201,10 @@ int main(int argc, char **argv) {
     {
         zl = createList();
         p = ziplistIndex(zl, 2);
     {
         zl = createList();
         p = ziplistIndex(zl, 2);
-        while ((p = ziplistNext(p, &s)) != NULL) {
-            printf("Entry: %s (length %ld)\n", s, sdslen(s));
+        while ((p = ziplistNext(p, &entry, &elen)) != NULL) {
+            printf("Entry: ");
+            fwrite(entry,elen,1,stdout);
+            printf(" (length %d)\n", elen);
         }
         printf("\n");
     }
         }
         printf("\n");
     }
@@ -207,7 +213,7 @@ int main(int argc, char **argv) {
     {
         zl = createList();
         p = ziplistIndex(zl, 3);
     {
         zl = createList();
         p = ziplistIndex(zl, 3);
-        if (ziplistNext(p, &s) == NULL) {
+        if (ziplistNext(p, &entry, &elen) == NULL) {
             printf("No entry\n");
         } else {
             printf("ERROR\n");
             printf("No entry\n");
         } else {
             printf("ERROR\n");