]> git.saurik.com Git - redis.git/commitdiff
Optimize SDIFF to return as soon as the result set is empty
authorAman Gupta <aman@tmm1.net>
Sun, 17 May 2009 19:25:05 +0000 (12:25 -0700)
committerAman Gupta <aman@tmm1.net>
Sun, 17 May 2009 19:25:05 +0000 (12:25 -0700)
redis.c

diff --git a/redis.c b/redis.c
index 6be82b4b008a7e1e30b2f263b5f6ef70e224cc4e..a3341f6d84161b916777f121d84de156affe7f91 100644 (file)
--- a/redis.c
+++ b/redis.c
@@ -3112,6 +3112,7 @@ static void sunionDiffGenericCommand(redisClient *c, robj **setskeys, int setsnu
     /* Iterate all the elements of all the sets, add every element a single
      * time to the result set */
     for (j = 0; j < setsnum; j++) {
+        if (op == REDIS_OP_DIFF && j == 0 && !dv[j]) break; /* result set is empty */
         if (!dv[j]) continue; /* non existing keys are like empty sets */
 
         di = dictGetIterator(dv[j]);
@@ -3134,6 +3135,8 @@ static void sunionDiffGenericCommand(redisClient *c, robj **setskeys, int setsnu
             }
         }
         dictReleaseIterator(di);
+
+        if (op == REDIS_OP_DIFF && cardinality == 0) break; /* result set is empty */
     }
 
     /* Output the content of the resulting set, if not in STORE mode */