[futurebasic] Re: [FB] Fast lookups and jumps

Message: < previous - next > : Reply : Subscribe : Cleanse
Home   : April 2002 : Group Archive : Group : All Groups

From: Joe Lewis Wilkins <PepeToo@...>
Date: Wed, 24 Apr 2002 07:15:40 -0700
I guess it depends on "how" you get the stings in the
first place. In some situations, I'm sure you could
manage to "force" an integer "response" instead;
other times, I guess not. It probably has to do with
your mindset, and how you view the situation.

Joe Wilkins

"Edwards, Waverly" wrote:

> Yes, 99% of the time I know the text will match one
> of the case statements.  I tried a conversion of the
> string to a number but I lost time in the conversion
> before actually comparing to the hashed value.
>
> I either needed to come up with a faster hash so I
> could do a numeric comparison or forego the case
> statements by using a jump table, compensating for
> the computation time.
>
> After quite a bit of experimentation I figured that
> if I (or anyone else) had an idea for a jump table
> I might be able to beat the clock at a cost of code
> ugliness and loss of flexibility.
>
> W.
>
> -----Original Message-----
> From: Joe Lewis Wilkins [mailto:PepeToo@...]
> Sent: Tuesday, April 23, 2002 7:26 PM
> To: futurebasic@...
> Subject: Re: [FB] Fast lookups and jumps
>
> Hi Wave,
>
> Since you "appear" to know what the strings are, why not
> substitute integers for them, or even convert them to ascii
> numbers before you use the SELECT/CASE structure. Seems
> to me that they could become 1,2,3,4, etc.
>
> Or am I being too naive?
>
> Joe Wilkins
>
> "Edwards, Waverly" wrote:
>
> > I have the need for speed.  Does anyone have a
> > better idea for a jump table to replace a SELECT/CASE
> > structure?
> >
> > What I would like to do is to jump to a certain section
> > based on the contents of a string.  The string will be one
> > to four characters in length, all capitals.
> >
> > What I am doing now is easy and flexible but
> > I think there may be a faster, less flexible way to do
> > the same thing.  Ultimately, I want to see if I can gain
> > enough speed to warrant some ugly inflexible code.
> >
> > This is what I do now.
> >
> > SELECT myString$
> > CASE "BD"
> > // do this ...
> > CASE "LI"
> > // do this ...
> > CASE "SIMM"
> > // do this ...
> > CASE "XY"
> > // do this ...
> > CASE "D"
> > // do this ...
> > ....
> > ....
> > ....
> > // THERE ARE ABOUT 40 CASE STATEMENTS
> > // ORDERED BY FREQUENCY FOR SPEED.
> > ....
> > ....
> > END SELECT
> >
> > I get good speed now but I what I would like to do is something like
> > using an array as a lookup table
> >
> > hashVal = FN hashString(myString)
> >  // hash value is the index into array
> >
> > jumpAddr = myAddrLookup(hashVal)
> > // array will need to be large and mostly
> > // empty to support a direct relationship
> > // of hash value to index
> >
> > goto jumpAddr
> >
> > "BD"
> > // do this ...
> > EXIT FN
> > "LI"
> > // do this ...
> > EXIT FN
> > "SIMM"
> > // do this ...
> > EXIT FN
> >
> > The problem here is that it would take longer to compute the hash value
> > than it would to go through the select statements.  Unfortunately I cant
> > do this
> >
> > hashVal = [@myString +1]
> >
> > because the string length is variably one to four characters
> >
> > I cant do this
> >
> > select myString[0]  // string length
> > case 1
> >    hashVal = myString[1]
> > case 2
> >    hashVal = myString.1%
> > case 3
> >    // cant do three at all
> > case 4
> >   hashVal = myString.1&
> > end select
> >
> > because I use up time just testing the string length before I get to the
> > table lookup.
> >
> > I'm willing to sacrifice memory, inflexible and ugly code in order to
> > test the idea of getting nearly instantaneous jumps but none of the
> > ideas I have are fast.
> >
> > Any ideas?
> >
> > W.
> >
> > --
> > To unsubscribe, send ANY message to
> <futurebasic-unsubscribe@...>
>
> --
> To unsubscribe, send ANY message to <futurebasic-unsubscribe@...>
>
> --
> To unsubscribe, send ANY message to <futurebasic-unsubscribe@...>