apr-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Brian Pane <bp...@pacbell.net>
Subject Re: [PATCH] speedup for apr_table_t
Date Sat, 17 Nov 2001 22:26:17 GMT
Cliff Woolley wrote:

>On Sat, 17 Nov 2001, Brian Pane wrote:
>
>>This patch adds a cache to each element in an apr_table_t.
>>The cache consists of a 32-bit int containing the first 4 bytes
>>of the element's key, converted to uppercase.
>>
>
>How about something like this:
>
>#ifndef EBCDIC
>#define CASE_MASK 0xdfdfdfdf
>#else
>#define CASE_MASK 0x0 /* whatever this is supposed to be */
>#endif
>
>#define COMPUTE_KEY_PREFIX(key, prefix)         \
>{                                               \
>    if (key[0] && key[1] && key[2] && key[3]) { \
>        prefix = (*((int *)(key))) & CASE_MASK; \
>    }                                           \
>    else {                                      \
>        prefix = 0;                             \
>    }                                           \
>

The only problem with this is that the bytes in the integer end up
"backwards" on little-endian machines.  That means that, while you
can check for equality on the prefix, you can't do greater-than/less-than
comparisons.

I used the more complicated, shift-based approach because it
guarantees that greater-than/less-than comparisons on the prefix
will yield the same results as strcasecmp on the first 4 bytes.
This makes it possible to use the prefix in the comparator
function in the big qsort in apr_table_overlap, which does
a *lot* of strcasecmp calls otherwise.

--Brian




Mime
View raw message