diff options
author | Wilco Dijkstra <wdijkstr@arm.com> | 2015-08-05 15:24:06 +0100 |
---|---|---|
committer | Wilco Dijkstra <wdijkstr@arm.com> | 2015-08-05 16:24:03 +0100 |
commit | f29ac72effae859140bb0d7fffdb1e6cef0ffed0 (patch) | |
tree | 8f21084d089aa7048842421dcaac965299a8d10b /string/memccpy.c | |
parent | f6482cf29d3094ca9688be59802353014c528959 (diff) | |
download | glibc-f29ac72effae859140bb0d7fffdb1e6cef0ffed0.zip glibc-f29ac72effae859140bb0d7fffdb1e6cef0ffed0.tar.gz glibc-f29ac72effae859140bb0d7fffdb1e6cef0ffed0.tar.bz2 |
Improve memccpy performance by using memchr/memcpy/mempcpy rather than
a byte loop. Overall performance on bench-memccpy is > 2x faster when
using the C implementation of memchr and an optimized memcpy.
Diffstat (limited to 'string/memccpy.c')
-rw-r--r-- | string/memccpy.c | 11 |
1 files changed, 4 insertions, 7 deletions
diff --git a/string/memccpy.c b/string/memccpy.c index d9ed697..0987c84 100644 --- a/string/memccpy.c +++ b/string/memccpy.c @@ -26,15 +26,12 @@ void * __memccpy (void *dest, const void *src, int c, size_t n) { - const char *s = src; - char *d = dest; - const char x = c; - size_t i = n; + void *p = memchr (src, c, n); - while (i-- > 0) - if ((*d++ = *s++) == x) - return d; + if (p != NULL) + return __mempcpy (dest, src, p - src + 1); + memcpy (dest, src, n); return NULL; } |