svn commit: r250215 - stable/9/lib/libc/locale

Sergey Kandaurov pluknet at freebsd.org
Fri May 3 17:49:07 UTC 2013


On 3 May 2013 20:40, Andrey Chernov <ache at freebsd.org> wrote:
> I don't think this change is optimal (cause slowdown) since you add
> unneeded strlen() in the loop for known-sized elements plus one strlen()
> for tested property, and wctype_l() itself can be called very often, so
> we definitely don't need slowdown here.
> Since most of elements have equal sizes, your len1 == len2 condition
> gains almost nothing for valid calls.

Thanks, you are correct. With this change I got 2-6 times slowdown depending
on the specified wctype. I will look at how it can be optimized.

>
> On 03.05.2013 19:52, Sergey Kandaurov wrote:
>> Modified: stable/9/lib/libc/locale/wctype.c
>> ==============================================================================
>> --- stable/9/lib/libc/locale/wctype.c Fri May  3 15:28:31 2013        (r250214)
>> +++ stable/9/lib/libc/locale/wctype.c Fri May  3 15:52:43 2013        (r250215)
>> @@ -57,35 +57,54 @@ iswctype_l(wint_t wc, wctype_t charclass
>>  wctype_t
>>  wctype_l(const char *property, locale_t locale)
>>  {
>> -     static const struct {
>> -             const char      *name;
>> -             wctype_t         mask;
>> -     } props[] = {
>> -             { "alnum",      _CTYPE_A|_CTYPE_D },
>> -             { "alpha",      _CTYPE_A },
>> -             { "blank",      _CTYPE_B },
>> -             { "cntrl",      _CTYPE_C },
>> -             { "digit",      _CTYPE_D },
>> -             { "graph",      _CTYPE_G },
>> -             { "lower",      _CTYPE_L },
>> -             { "print",      _CTYPE_R },
>> -             { "punct",      _CTYPE_P },
>> -             { "space",      _CTYPE_S },
>> -             { "upper",      _CTYPE_U },
>> -             { "xdigit",     _CTYPE_X },
>> -             { "ideogram",   _CTYPE_I },     /* BSD extension */
>> -             { "special",    _CTYPE_T },     /* BSD extension */
>> -             { "phonogram",  _CTYPE_Q },     /* BSD extension */
>> -             { "rune",       0xFFFFFF00L },  /* BSD extension */
>> -             { NULL,         0UL },          /* Default */
>> +     const char *propnames =
>> +             "alnum\0"
>> +             "alpha\0"
>> +             "blank\0"
>> +             "cntrl\0"
>> +             "digit\0"
>> +             "graph\0"
>> +             "lower\0"
>> +             "print\0"
>> +             "punct\0"
>> +             "space\0"
>> +             "upper\0"
>> +             "xdigit\0"
>> +             "ideogram\0"    /* BSD extension */
>> +             "special\0"     /* BSD extension */
>> +             "phonogram\0"   /* BSD extension */
>> +             "rune\0";       /* BSD extension */
>> +     static const wctype_t propmasks[] = {
>> +             _CTYPE_A|_CTYPE_D,
>> +             _CTYPE_A,
>> +             _CTYPE_B,
>> +             _CTYPE_C,
>> +             _CTYPE_D,
>> +             _CTYPE_G,
>> +             _CTYPE_L,
>> +             _CTYPE_R,
>> +             _CTYPE_P,
>> +             _CTYPE_S,
>> +             _CTYPE_U,
>> +             _CTYPE_X,
>> +             _CTYPE_I,
>> +             _CTYPE_T,
>> +             _CTYPE_Q,
>> +             0xFFFFFF00L
>>       };
>> -     int i;
>> +     size_t len1, len2;
>> +     const char *p;
>> +     const wctype_t *q;
>>
>> -     i = 0;
>> -     while (props[i].name != NULL && strcmp(props[i].name, property) != 0)
>> -             i++;
>> +     len1 = strlen(property);
>> +     q = propmasks;
>> +     for (p = propnames; (len2 = strlen(p)) != 0; p += len2 + 1) {
>> +             if (len1 == len2 && memcmp(property, p, len1) == 0)
>> +                     return (*q);
>> +             q++;
>> +     }
>>
>> -     return (props[i].mask);
>> +     return (0UL);
>>  }
>>
>>  wctype_t wctype(const char *property)
>>
>
> --
> http://ache.vniz.net/
> bitcoin:13fGiNutKNHcVSsgtGQ7bQ5kgUKgEQHn7N



-- 
wbr,
pluknet


More information about the svn-src-all mailing list