Skip site navigation (1)Skip section navigation (2)
Date:      Fri, 3 May 2013 21:49:05 +0400
From:      Sergey Kandaurov <pluknet@freebsd.org>
To:        Andrey Chernov <ache@freebsd.org>
Cc:        svn-src-stable@freebsd.org, svn-src-all@freebsd.org, src-committers@freebsd.org, svn-src-stable-9@freebsd.org
Subject:   Re: svn commit: r250215 - stable/9/lib/libc/locale
Message-ID:  <CAE-mSO%2BB_p_HCbKwSO-rJ%2BdforcPEfThmOxy%2BKi_1e9zPn3q_w@mail.gmail.com>
In-Reply-To: <5183E899.4000503@freebsd.org>
References:  <201305031552.r43FqiPN024580@svn.freebsd.org> <5183E899.4000503@freebsd.org>

next in thread | previous in thread | raw e-mail | index | archive | help
On 3 May 2013 20:40, Andrey Chernov <ache@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



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?CAE-mSO%2BB_p_HCbKwSO-rJ%2BdforcPEfThmOxy%2BKi_1e9zPn3q_w>