Minor speed hacks in AllocSetReset: avoid clearing the freelist headers
authorTom Lane <[email protected]>
Sat, 14 May 2005 20:29:13 +0000 (20:29 +0000)
committerTom Lane <[email protected]>
Sat, 14 May 2005 20:29:13 +0000 (20:29 +0000)
when the blocks list is empty (there can surely be no freelist items if
the context contains no memory), and use MemSetAligned not MemSet to
clear the headers (we assume alignof(pointer) >= alignof(int32)).
Per discussion with Atsushi Ogawa.  He proposes some further hacking
that I'm not yet sold on, but these two changes are unconditional wins
since there is no case in which they make things slower.

src/backend/utils/mmgr/aset.c

index df146c1ca4752814bad031d86078d9e55b9d5316..afbb57af68c1f37048552432ecca9a665fe5a983 100644 (file)
@@ -395,12 +395,17 @@ AllocSetReset(MemoryContext context)
        AllocSetCheck(context);
 #endif
 
+       /* Nothing to do if context has never contained any data */
+       if (block == NULL)
+               return;
+
        /* Clear chunk freelists */
-       MemSet(set->freelist, 0, sizeof(set->freelist));
+       MemSetAligned(set->freelist, 0, sizeof(set->freelist));
+
        /* New blocks list is either empty or just the keeper block */
        set->blocks = set->keeper;
 
-       while (block != NULL)
+       do
        {
                AllocBlock      next = block->next;
 
@@ -427,6 +432,7 @@ AllocSetReset(MemoryContext context)
                }
                block = next;
        }
+       while (block != NULL);
 }
 
 /*
@@ -451,7 +457,7 @@ AllocSetDelete(MemoryContext context)
 #endif
 
        /* Make it look empty, just in case... */
-       MemSet(set->freelist, 0, sizeof(set->freelist));
+       MemSetAligned(set->freelist, 0, sizeof(set->freelist));
        set->blocks = NULL;
        set->keeper = NULL;