This is the mail archive of the
libc-alpha@sourceware.org
mailing list for the glibc project.
RE: [PATCH] Improve stpncpy performance
- From: "Wilco Dijkstra" <wdijkstr at arm dot com>
- To: <libc-alpha at sourceware dot org>
- Date: Fri, 27 Feb 2015 15:10:32 -0000
- Subject: RE: [PATCH] Improve stpncpy performance
- Authentication-results: sourceware.org; auth=none
- References:
ping
> -----Original Message-----
> From: Wilco Dijkstra [mailto:wdijkstr@arm.com]
> Sent: 12 January 2015 15:09
> To: 'libc-alpha@sourceware.org'
> Subject: [PATCH] Improve stpncpy performance
>
> Like strncpy, this patch improves stpncpy performance by using strnlen/memcpy/memset rather
> than a byte loop. Performance on bench-stpncpy is ~2x faster on average.
>
> ChangeLog:
>
> 2015-01-12 Wilco Dijkstra wdijkstr@arm.com
>
> * string/stpncpy.c (stpncpy): Improve performance using
> __strnlen/memcpy/memset.
>
> ---
> string/stpncpy.c | 59 ++++++--------------------------------------------------
> 1 file changed, 6 insertions(+), 53 deletions(-)
>
> diff --git a/string/stpncpy.c b/string/stpncpy.c
> index fad747e..50521aa 100644
> --- a/string/stpncpy.c
> +++ b/string/stpncpy.c
> @@ -15,7 +15,7 @@
> License along with the GNU C Library; if not, see
> <http://www.gnu.org/licenses/>. */
>
> -/* This is almost copied from strncpy.c, written by Torbjorn Granlund. */
> +#include <stddef.h>
>
> #ifdef HAVE_CONFIG_H
> # include <config.h>
> @@ -41,59 +41,12 @@ weak_alias (__stpncpy, stpncpy)
> char *
> STPNCPY (char *dest, const char *src, size_t n)
> {
> - char c;
> - char *s = dest;
> -
> - if (n >= 4)
> - {
> - size_t n4 = n >> 2;
> -
> - for (;;)
> - {
> - c = *src++;
> - *dest++ = c;
> - if (c == '\0')
> - break;
> - c = *src++;
> - *dest++ = c;
> - if (c == '\0')
> - break;
> - c = *src++;
> - *dest++ = c;
> - if (c == '\0')
> - break;
> - c = *src++;
> - *dest++ = c;
> - if (c == '\0')
> - break;
> - if (--n4 == 0)
> - goto last_chars;
> - }
> - n -= dest - s;
> - goto zero_fill;
> - }
> -
> - last_chars:
> - n &= 3;
> - if (n == 0)
> + size_t size = __strnlen (src, n);
> + memcpy (dest, src, size);
> + dest += size;
> + if (size == n)
> return dest;
> -
> - for (;;)
> - {
> - c = *src++;
> - --n;
> - *dest++ = c;
> - if (c == '\0')
> - break;
> - if (n == 0)
> - return dest;
> - }
> -
> - zero_fill:
> - while (n-- > 0)
> - dest[n] = '\0';
> -
> - return dest - 1;
> + return memset (dest, '\0', n - size);
> }
> #ifdef weak_alias
> libc_hidden_def (__stpncpy)
> --
> 1.9.1