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-stable-9
mailing list