From 48497aba8ec7887dd505e37aa95ab52348fa8cb2 Mon Sep 17 00:00:00 2001 From: Wilco Dijkstra Date: Wed, 19 Aug 2015 16:28:21 +0100 Subject: [PATCH] Improve stpncpy performance by using __strnlen/memcpy/memset rather than a byte loop. Performance on bench-stpncpy is ~2x faster on average. --- ChangeLog | 5 ++++ string/stpncpy.c | 59 ++++-------------------------------------------- 2 files changed, 10 insertions(+), 54 deletions(-) diff --git a/ChangeLog b/ChangeLog index da4f3c75bd..23760214ab 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,8 @@ +2015-08-19 Wilco Dijkstra + + * string/stpncpy.c (stpncpy): Improve performance using + __strnlen/memcpy/memset. + 2015-08-19 Andrew Senkevich [BZ #18796] diff --git a/string/stpncpy.c b/string/stpncpy.c index eb65a5f46f..4c3351ba01 100644 --- a/string/stpncpy.c +++ b/string/stpncpy.c @@ -15,8 +15,6 @@ License along with the GNU C Library; if not, see . */ -/* This is almost copied from strncpy.c, written by Torbjorn Granlund. */ - #ifdef HAVE_CONFIG_H # include #endif @@ -41,59 +39,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)