This is the mail archive of the
libc-alpha@sourceware.org
mailing list for the glibc project.
Re: [PING][PATCH] More effective generic strrchr.
- From: Will Newton <will dot newton at linaro dot org>
- To: Ondřej Bílka <neleai at seznam dot cz>
- Cc: libc-alpha <libc-alpha at sourceware dot org>
- Date: Wed, 4 Dec 2013 13:13:34 +0000
- Subject: Re: [PING][PATCH] More effective generic strrchr.
- Authentication-results: sourceware.org; auth=none
- References: <20131005071542 dot GA13382 at domone> <20131204125831 dot GA6095 at domone dot podge>
On 4 December 2013 12:58, OndÅej BÃlka <neleai@seznam.cz> wrote:
> ping
> On Sat, Oct 05, 2013 at 09:15:42AM +0200, OndÅej BÃlka wrote:
>>
>> A generic implementation of strrchr could be improved by following
>> patch. As it is likely that last occurrence of c will be near end we
>> could quickly find it. This is also much faster for degenerate inputs
>> like:
>>
>> strrchr("xyxyxyxyxyxyxyxyxyxyxyxyx...",'x');
>>
>> where a loop slows us down.
>>
>> * string/strrchr.c: Improve implementation.
This changelog is not really adequate or correct.
>>
>> ---
>> string/strrchr.c | 19 ++-----------------
>> 1 file changed, 2 insertions(+), 17 deletions(-)
>>
>> diff --git a/string/strrchr.c b/string/strrchr.c
>> index bdec841..ad242b6 100644
>> --- a/string/strrchr.c
>> +++ b/string/strrchr.c
>> @@ -23,23 +23,8 @@
>> char *
>> strrchr (const char *s, int c)
>> {
>> - const char *found, *p;
>> -
>> - c = (unsigned char) c;
>> -
>> - /* Since strchr is fast, we use it rather than the obvious loop. */
>> -
>> - if (c == '\0')
>> - return strchr (s, '\0');
>> -
>> - found = NULL;
>> - while ((p = strchr (s, c)) != NULL)
>> - {
>> - found = p;
>> - s = p + 1;
>> - }
>> -
>> - return (char *) found;
>> + /* We need to include terminating zero for case c == 0. */
>> + return __memrchr (s, c, strlen (s) + 1);
Do you have benchmark results for this? It would be good to test on
systems that have fast memrchr (e.g. i386/powerpc/x86_64) and ones
that don't (the rest).
--
Will Newton
Toolchain Working Group, Linaro