From owner-svn-src-stable@FreeBSD.ORG Sat May 4 12:03:17 2013 Return-Path: Delivered-To: svn-src-stable@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:1900:2254:206a::19:1]) by hub.freebsd.org (Postfix) with ESMTP id 3E833E55; Sat, 4 May 2013 12:03:17 +0000 (UTC) (envelope-from pluknet@gmail.com) Received: from mail-wg0-x22d.google.com (mail-wg0-x22d.google.com [IPv6:2a00:1450:400c:c00::22d]) by mx1.freebsd.org (Postfix) with ESMTP id 2D98F16AD; Sat, 4 May 2013 12:03:16 +0000 (UTC) Received: by mail-wg0-f45.google.com with SMTP id l18so2403330wgh.24 for ; Sat, 04 May 2013 05:03:15 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=mime-version:x-received:sender:in-reply-to:references:date :x-google-sender-auth:message-id:subject:from:to:cc:content-type; bh=8+V196CJephydOu44Eavc6IR53NuHKC+pExxJdQDqOc=; b=vl+TxozZC1VyQmQBsyBrdxljDJr+vnpw5tlYgOWkS6KSQwmod6YAtJaK2LAj63SPT6 giHN+ed0xTHX+WvUjPxqB4skx+oaGQZtvvjbwS06NT8ucQ0TaISSRvSz2tYsOjiNu9A4 9nBVfMzC8kBJ6ZRTUh5I4faqAH6NzyJQLM9ybsq1i97LksljR/fRSW4ENcbcYwdLO9Ci PeBHfBs8HIdbB5AmvbcAZ12UGlVyYO1E+ubcngJKjHOTQiQgrWF7fmHkkxJi1Y4md7lC UZ1H1HuE/vx/FyOtXFVt0v+Nn+cwZytYFe1ex89/mJRvADPZLlJv8Fs6tkuuvfCquKs0 NAqw== MIME-Version: 1.0 X-Received: by 10.180.82.74 with SMTP id g10mr1866689wiy.10.1367668995367; Sat, 04 May 2013 05:03:15 -0700 (PDT) Sender: pluknet@gmail.com Received: by 10.194.29.199 with HTTP; Sat, 4 May 2013 05:03:15 -0700 (PDT) In-Reply-To: <5184ED7E.3040703@freebsd.org> References: <201305031552.r43FqiPN024580@svn.freebsd.org> <5183E899.4000503@freebsd.org> <20130503195540.GA52657@stack.nl> <5184ED7E.3040703@freebsd.org> Date: Sat, 4 May 2013 16:03:15 +0400 X-Google-Sender-Auth: VbTiFWBd0feDaoWc7YirzTPfzJU Message-ID: Subject: Re: svn commit: r250215 - stable/9/lib/libc/locale From: Sergey Kandaurov To: Andrey Chernov Content-Type: text/plain; charset=ISO-8859-1 Cc: svn-src-stable@freebsd.org, svn-src-all@freebsd.org, src-committers@freebsd.org, svn-src-stable-9@freebsd.org, Jilles Tjoelker X-BeenThere: svn-src-stable@freebsd.org X-Mailman-Version: 2.1.14 Precedence: list List-Id: SVN commit messages for all the -stable branches of the src tree List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sat, 04 May 2013 12:03:17 -0000 On 4 May 2013 15:14, Andrey Chernov wrote: > On 04.05.2013 0:48, Sergey Kandaurov wrote: >> On 3 May 2013 23:55, Jilles Tjoelker wrote: >>> Some sort of perfect hashing can also be an option, although it makes it >>> harder to add new properties or adds a build dependency on gperf(1) that >>> we would like to get rid of. >> I hacked a bit on wctype. Speaking about speed, it shows about 1-3.5x >> improvement over the previous fast version (before r250215). >> >> Time spend for 2097152 wctype() calls for each of wctype property >> current previous mine >> alnum 0.090554676 0.035821210 0.033270579 >> alpha 0.172074310 0.052461036 0.044916572 >> blank 0.261109989 0.055735281 0.036682745 >> cntrl 0.357318986 0.069249831 0.038292782 >> digit 0.436381530 0.094194364 0.039249005 >> graph 0.540954812 0.085580099 0.043331460 >> lower 0.618306476 0.095665215 0.044070399 >> print 0.707443135 0.132559305 0.048216097 >> punct 0.788922052 0.142809109 0.062871432 >> space 0.888263108 0.150516644 0.054086142 >> upper 0.966903461 0.173593592 0.054027834 >> xdigit 0.406611275 0.201614227 0.060695939 >> ideogram 0.439763499 0.239640723 0.068566486 >> special 0.523128094 0.249156298 0.099278051 >> phonogram 0.564975870 0.260972651 0.135751471 >> rune 0.637392247 0.235195497 0.064093971 >> >> Index: locale/wctype.c >> =================================================================== >> --- locale/wctype.c (revision 250217) >> +++ locale/wctype.c (working copy) >> @@ -74,6 +74,9 @@ >> "special\0" /* BSD extension */ >> "phonogram\0" /* BSD extension */ >> "rune\0"; /* BSD extension */ >> + static const size_t propnamlen[] = { >> + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 6, 8, 7, 9, 4, 0 >> + }; >> static const wctype_t propmasks[] = { >> _CTYPE_A|_CTYPE_D, >> _CTYPE_A, >> @@ -92,16 +95,17 @@ >> _CTYPE_Q, >> 0xFFFFFF00L >> }; >> - size_t len1, len2; >> + const size_t *len2; >> const char *p; >> const wctype_t *q; >> >> - len1 = strlen(property); >> q = propmasks; >> - for (p = propnames; (len2 = strlen(p)) != 0; p += len2 + 1) { >> - if (len1 == len2 && memcmp(property, p, len1) == 0) >> + len2 = propnamlen; >> + for (p = propnames; *len2 != 0; ) { >> + if (property[0] == p[0] && strcmp(property, p) == 0) >> return (*q); >> - q++; >> + p += *len2 + 1; >> + q++; len2++; >> } >> >> return (0UL); >> [...] > > BTW, I don't run tests and look in asm code for sure, but it seems > property[0] == p[0] is unneeded because almost every compiler tries to > inline strcmp(). Doesn't seem so (in-lining), see below. Apparently property[0] == p[0] is cheaper than strcmp() for negative checks. Removing this condition brings perf. numbers back to the "previous" column. Looking into asm: # property[0] == p[0] 4d: 44 3a 75 00 cmp 0x0(%rbp),%r14b 51: 75 dd jne 30 # strcmp() 53: 48 89 ee mov %rbp,%rsi 56: 4c 89 ff mov %r15,%rdi 59: e8 00 00 00 00 callq 5e 5e: 85 c0 test %eax,%eax 60: 75 ce jne 30 -- wbr, pluknet