Avoid fetching the size class more than once.
authorRobert Haas <rhaas@postgresql.org>
Tue, 29 Apr 2014 20:44:20 +0000 (20:44 +0000)
committerRobert Haas <rhaas@postgresql.org>
Tue, 29 Apr 2014 20:44:20 +0000 (20:44 +0000)
This is noticeably faster.

src/backend/utils/mmgr/sb_alloc.c

index 1fdcef3575efce4e751c4ad528224f4767d7db4a..fc2e43d18d854e2eac1dcfb6bc31ed68c2b1222b 100644 (file)
@@ -285,6 +285,7 @@ sb_free(void *ptr)
        char   *superblock;
        Size    pageno;
        Size    obsize;
+       uint16  size_class;
 
        /* Locate the containing superblock. */
        region = sb_lookup_region(ptr);
@@ -305,9 +306,12 @@ sb_free(void *ptr)
                        LWLockAcquire(lock, LW_EXCLUSIVE);
        }
 
+       /* Compute the object size. */
+       size_class = span->size_class;
+       obsize = sb_size_classes[size_class];
+
        /* Put the object on the superblock's freelist. */
        superblock = relptr_access(base, span->start);
-       obsize = sb_size_classes[span->size_class];
        Assert(((char *) ptr) >= superblock);
        Assert(((char *) ptr) < superblock + SB_SUPERBLOCK_SIZE);
        Assert((((char *) ptr) - superblock) % obsize == 0);
@@ -340,10 +344,8 @@ sb_free(void *ptr)
        {
                sb_heap *heap = relptr_access(base, span->parent);
                Size    first_page;
-               uint16  size_class;
 
                sb_unlink_span(base, heap, span);
-               size_class = span->size_class;
                first_page = fpm_pointer_to_page(fpm_base,
                                                                                 relptr_access(base, span->start));
                FreePageManagerPut(region->fpm, first_page, span->npages);