Commit 39a333aa authored by Tom Lane's avatar Tom Lane

Marginal performance hack: remove the loop that used to be needed to

look through a freelist for a chunk of adequate size.  For a long time
now, all elements of a given freelist have been exactly the same
allocated size, so we don't need a loop.  Since the loop never iterated
more than once, you'd think this wouldn't matter much, but it makes a
noticeable savings in a simple test --- perhaps because the compiler
isn't optimizing on a mistaken assumption that the loop would repeat.
AllocSetAlloc is called often enough that saving even a couple of
instructions is worthwhile.
parent b1a1ea49
...@@ -11,7 +11,7 @@ ...@@ -11,7 +11,7 @@
* Portions Copyright (c) 1994, Regents of the University of California * Portions Copyright (c) 1994, Regents of the University of California
* *
* IDENTIFICATION * IDENTIFICATION
* $PostgreSQL: pgsql/src/backend/utils/mmgr/aset.c,v 1.71 2007/01/05 22:19:47 momjian Exp $ * $PostgreSQL: pgsql/src/backend/utils/mmgr/aset.c,v 1.72 2007/04/30 00:12:08 tgl Exp $
* *
* NOTE: * NOTE:
* This is a new (Feb. 05, 1999) implementation of the allocation set * This is a new (Feb. 05, 1999) implementation of the allocation set
...@@ -516,7 +516,6 @@ AllocSetAlloc(MemoryContext context, Size size) ...@@ -516,7 +516,6 @@ AllocSetAlloc(MemoryContext context, Size size)
AllocSet set = (AllocSet) context; AllocSet set = (AllocSet) context;
AllocBlock block; AllocBlock block;
AllocChunk chunk; AllocChunk chunk;
AllocChunk priorfree;
int fidx; int fidx;
Size chunk_size; Size chunk_size;
Size blksize; Size blksize;
...@@ -578,26 +577,16 @@ AllocSetAlloc(MemoryContext context, Size size) ...@@ -578,26 +577,16 @@ AllocSetAlloc(MemoryContext context, Size size)
/* /*
* Request is small enough to be treated as a chunk. Look in the * Request is small enough to be treated as a chunk. Look in the
* corresponding free list to see if there is a free chunk we could reuse. * corresponding free list to see if there is a free chunk we could reuse.
*/
fidx = AllocSetFreeIndex(size);
priorfree = NULL;
for (chunk = set->freelist[fidx]; chunk; chunk = (AllocChunk) chunk->aset)
{
if (chunk->size >= size)
break;
priorfree = chunk;
}
/*
* If one is found, remove it from the free list, make it again a member * If one is found, remove it from the free list, make it again a member
* of the alloc set and return its data address. * of the alloc set and return its data address.
*/ */
fidx = AllocSetFreeIndex(size);
chunk = set->freelist[fidx];
if (chunk != NULL) if (chunk != NULL)
{ {
if (priorfree == NULL) Assert(chunk->size >= size);
set->freelist[fidx] = (AllocChunk) chunk->aset;
else set->freelist[fidx] = (AllocChunk) chunk->aset;
priorfree->aset = chunk->aset;
chunk->aset = (void *) set; chunk->aset = (void *) set;
...@@ -618,7 +607,7 @@ AllocSetAlloc(MemoryContext context, Size size) ...@@ -618,7 +607,7 @@ AllocSetAlloc(MemoryContext context, Size size)
/* /*
* Choose the actual chunk size to allocate. * Choose the actual chunk size to allocate.
*/ */
chunk_size = 1 << (fidx + ALLOC_MINBITS); chunk_size = (1 << ALLOC_MINBITS) << fidx;
Assert(chunk_size >= size); Assert(chunk_size >= size);
/* /*
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment