Shave a few cycles in compare_pathkeys() by checking for pointer-identical
authorTom Lane <tgl@sss.pgh.pa.us>
Sat, 28 Feb 2009 03:51:05 +0000 (03:51 +0000)
committerTom Lane <tgl@sss.pgh.pa.us>
Sat, 28 Feb 2009 03:51:05 +0000 (03:51 +0000)
input lists before we grovel through the lists.  This doesn't save much,
but testing shows that the case of both inputs NIL is common enough that
it saves something.  And this is used enough to be a hotspot.

src/backend/optimizer/path/pathkeys.c

index fe5342dcf7defb0e0004b3900f33a2260c5a9b00..93491589ec900391f8a1208630e17e8f8dfbee04 100644 (file)
@@ -332,6 +332,14 @@ compare_pathkeys(List *keys1, List *keys2)
        ListCell   *key1,
                           *key2;
 
+       /*
+        * Fall out quickly if we are passed two identical lists.  This mostly
+        * catches the case where both are NIL, but that's common enough to
+        * warrant the test.
+        */
+       if (keys1 == keys2)
+               return PATHKEYS_EQUAL;
+
        forboth(key1, keys1, key2, keys2)
        {
                PathKey    *pathkey1 = (PathKey *) lfirst(key1);
@@ -354,11 +362,11 @@ compare_pathkeys(List *keys1, List *keys2)
         * If we reached the end of only one list, the other is longer and
         * therefore not a subset.
         */
-       if (key1 == NULL && key2 == NULL)
-               return PATHKEYS_EQUAL;
        if (key1 != NULL)
                return PATHKEYS_BETTER1;        /* key1 is longer */
-       return PATHKEYS_BETTER2;        /* key2 is longer */
+       if (key2 != NULL)
+               return PATHKEYS_BETTER2;        /* key2 is longer */
+       return PATHKEYS_EQUAL;
 }
 
 /*