On Tue, 2 Mar 1999, Chris Jacobson wrote:
>I was reviewing George's Buffer code (I run a mix of 1.9 and 2.0 and my
>own mods), and realized the magnitude/bitcounting/rounding code was a bit
>... superfluous.
>
>George, did you compare the current code for finding the next largest
>power of 2, to the simple loop:
>
>for (i = 0; i < 32; i++)
> if ((1 << i) >= size)
> break;
You mean round_to_pow2? It would be this without shortcuts:
static size_t round_to_pow2(size_t y)
{
size_t x = (1 << SIZE_T_HIGHBIT); /* Set the highest bit possible... */
while ((y & x) == 0) /* Scan for the highest bit in target. */
x >>= 1; /* Bit not found in target, shift mask right one bit. */
if (x == y) /* If the numbers are equal, it's already rounded. */
return x;
return (x << 1); /* Numbers don't match, round up to compensate. */
}
>Normally I would presume you did, but the current code seems like such
>overkill that I am left to wonder if someone had spiked your coffee that
>day <g>, if you were just feeling creative, if your routines had other
>purposes that have yet to reach the light of day in Pre-2.0 code, or if
>they are actually faster.
I was bored and benchmark happy. If you're interested, take a look at
http://www.circlemud.org/~greerga/bench.c
It goes from 3,600 usec to 8,800 usec without the shortcuts for an even
distribution from 32,767 to 0. I expected those to be the standard values
requested in the buffer allocations.
As given, yours took ~19,000 usec for the same loop. There's a reason I
shift the value first and then shift it down one every time. Making it
shift the whole thing every time is slow.
If I change yours to:
static size_t chris_round(unsigned int size)
{
unsigned int i = (1 << 0);
for (i = (1 << 0); i < (1 << 31); i <<= 1)
if (i >= size)
break;
return i;
}
And remove my shorcuts, then it compares as:
#1 (my) : 8882 usec
#2 (cr) : 7325 usec
Otherwise, with shortcuts:
#1 (my) : 3576 usec
#2 (stk): 6520 usec
But I suppose they could be added to yours somehow, I'll look into it
sometime.
--
George Greer
greerga@circlemud.org
http://www.circlemud.org/~greerga/
+------------------------------------------------------------+
| Ensure that you have read the CircleMUD Mailing List FAQ: |
| http://qsilver.queensu.ca/~fletchra/Circle/list-faq.html |
+------------------------------------------------------------+
This archive was generated by hypermail 2b30 : 12/15/00 PST