This is the mail archive of the
glibc-cvs@sourceware.org
mailing list for the glibc project.
GNU C Library master sources branch master updated. glibc-2.18-663-g9f6e964c
- From: azanella at sourceware dot org
- To: glibc-cvs at sourceware dot org
- Date: 19 Dec 2013 11:46:56 -0000
- Subject: GNU C Library master sources branch master updated. glibc-2.18-663-g9f6e964c
This is an automated email from the git hooks/post-receive script. It was
generated because a ref change was pushed to the repository containing
the project "GNU C Library master sources".
The branch, master has been updated
via 9f6e964c3a951b6e19ed934aec1f0c101c295987 (commit)
from ee0a148a56083ed438ef2e6b312af38018643e7f (commit)
Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.
- Log -----------------------------------------------------------------
http://sourceware.org/git/gitweb.cgi?p=glibc.git;a=commitdiff;h=9f6e964c3a951b6e19ed934aec1f0c101c295987
commit 9f6e964c3a951b6e19ed934aec1f0c101c295987
Author: Rajalakshmi Srinivasaraghavan <raji@linux.vnet.ibm.com>
Date: Thu Dec 19 06:45:54 2013 -0500
benchtests: Add strtok benchmark
diff --git a/ChangeLog b/ChangeLog
index 9cd05ba..bee6f8b 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,8 @@
+2013-12-19 Rajalakshmi Srinivasaraghavan <raji@linux.vnet.ibm.com>
+
+ * benchtests/Makefile: Add bench-strtok.
+ * benchtests/bench-strtok.c: New file: strtok benchtest.
+
2013-12-19 Allan McRae <allan@archlinux.org>
* manual/install.texi: Suppress menu for plain text output.
diff --git a/benchtests/Makefile b/benchtests/Makefile
index eea384d..117228b 100644
--- a/benchtests/Makefile
+++ b/benchtests/Makefile
@@ -28,7 +28,7 @@ string-bench := bcopy bzero memccpy memchr memcmp memcpy memmem memmove \
mempcpy memset rawmemchr stpcpy stpncpy strcasecmp strcasestr \
strcat strchr strchrnul strcmp strcpy strcspn strlen \
strncasecmp strncat strncmp strncpy strnlen strpbrk strrchr \
- strspn strstr strcpy_chk stpcpy_chk memrchr strsep
+ strspn strstr strcpy_chk stpcpy_chk memrchr strsep strtok
string-bench-all := $(string-bench)
stdlib-bench := strtod
diff --git a/benchtests/bench-strtok.c b/benchtests/bench-strtok.c
new file mode 100644
index 0000000..c76d0e3
--- /dev/null
+++ b/benchtests/bench-strtok.c
@@ -0,0 +1,205 @@
+/* Measure strtok functions.
+ Copyright (C) 2013 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+
+ The GNU C Library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ The GNU C Library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with the GNU C Library; if not, see
+ <http://www.gnu.org/licenses/>. */
+
+#define TEST_MAIN
+#define TEST_NAME "strtok"
+#include "bench-string.h"
+
+char *
+simple_strtok (char *s1, char *s2)
+{
+ static char *saveptr;
+ char *token;
+ ssize_t i = 0, j = 0;
+ int found = 0;
+ size_t s2len = strlen (s2);
+
+ if (s1 == NULL)
+ s1 = saveptr;
+ if (s1 == NULL || *s1 == '\0')
+ return NULL;
+
+ while (!found)
+ {
+ if (s1[i] == '\0')
+ {
+ saveptr = NULL;
+ return NULL;
+ }
+ for (j = 0; j < s2len; j++)
+ {
+ if (s1[i] == s2[j])
+ {
+ i++;
+ found = 0;
+ break;
+ }
+ found = 1;
+ }
+ }
+ token = s1 + i;
+ i++;
+ found = 0;
+ while (!found)
+ {
+ if (s1[i] == '\0')
+ {
+ saveptr = NULL;
+ return token;
+ }
+ for (j = 0; j < s2len; j++)
+ {
+ if (s1[i] == s2[j])
+ {
+ found = 1;
+ break;
+ }
+ }
+ i++;
+ }
+ s1[i - 1] = '\0';
+ saveptr = s1 + i;
+ return token;
+}
+
+typedef char *(*proto_t) (const char *, const char *);
+
+IMPL (simple_strtok, 0)
+IMPL (strtok, 1)
+
+static void
+do_one_test (impl_t * impl, const char *s1, const char *s2)
+{
+ size_t i, iters = INNER_LOOP_ITERS;
+ timing_t start, stop, cur;
+ TIMING_NOW (start);
+ for (i = 0; i < iters; ++i)
+ {
+ CALL (impl, s1, s2);
+ CALL (impl, NULL, s2);
+ CALL (impl, NULL, s2);
+ }
+ TIMING_NOW (stop);
+
+ TIMING_DIFF (cur, start, stop);
+
+ TIMING_PRINT_MEAN ((double) cur, (double) iters);
+
+}
+
+
+static void
+do_test (size_t align1, size_t align2, size_t len1, size_t len2, int fail)
+{
+ char *s2 = (char *) (buf2 + align2);
+ static const char d[] = "1234567890abcdef";
+#define dl (sizeof (d) - 1)
+ char *ss2 = s2;
+ for (size_t l = len2; l > 0; l = l > dl ? l - dl : 0)
+ {
+ size_t t = l > dl ? dl : l;
+ ss2 = mempcpy (ss2, d, t);
+ }
+ s2[len2] = '\0';
+
+ printf ("Length %4zd/%zd, alignment %2zd/%2zd, %s:",
+ len1, len2, align1, align2, fail ? "fail" : "found");
+
+ FOR_EACH_IMPL (impl, 0)
+ {
+ char *s1 = (char *) (buf1 + align1);
+ if (fail)
+ {
+ char *ss1 = s1;
+ for (size_t l = len1; l > 0; l = l > dl ? l - dl : 0)
+ {
+ size_t t = l > dl ? dl : l;
+ memcpy (ss1, d, t);
+ ++ss1[len2 > 7 ? 7 : len2 - 1];
+ ss1 += t;
+ }
+ }
+ else
+ {
+ memset (s1, '0', len1);
+ memcpy (s1 + (len1 - len2) - 2, s2, len2);
+ if ((len1 / len2) > 4)
+ memcpy (s1 + (len1 - len2) - (3 * len2), s2, len2);
+ }
+ s1[len1] = '\0';
+ do_one_test (impl, s1, s2);
+ }
+ putchar ('\n');
+}
+
+static int
+test_main (void)
+{
+ test_init ();
+
+ printf ("%23s", "");
+ FOR_EACH_IMPL (impl, 0)
+ printf ("\t%s", impl->name);
+ putchar ('\n');
+
+ for (size_t klen = 2; klen < 32; ++klen)
+ for (size_t hlen = 2 * klen; hlen < 16 * klen; hlen += klen)
+ {
+ do_test (0, 0, hlen, klen, 0);
+ do_test (0, 0, hlen, klen, 1);
+ do_test (0, 3, hlen, klen, 0);
+ do_test (0, 3, hlen, klen, 1);
+ do_test (0, 9, hlen, klen, 0);
+ do_test (0, 9, hlen, klen, 1);
+ do_test (0, 15, hlen, klen, 0);
+ do_test (0, 15, hlen, klen, 1);
+
+ do_test (3, 0, hlen, klen, 0);
+ do_test (3, 0, hlen, klen, 1);
+ do_test (3, 3, hlen, klen, 0);
+ do_test (3, 3, hlen, klen, 1);
+ do_test (3, 9, hlen, klen, 0);
+ do_test (3, 9, hlen, klen, 1);
+ do_test (3, 15, hlen, klen, 0);
+ do_test (3, 15, hlen, klen, 1);
+
+ do_test (9, 0, hlen, klen, 0);
+ do_test (9, 0, hlen, klen, 1);
+ do_test (9, 3, hlen, klen, 0);
+ do_test (9, 3, hlen, klen, 1);
+ do_test (9, 9, hlen, klen, 0);
+ do_test (9, 9, hlen, klen, 1);
+ do_test (9, 15, hlen, klen, 0);
+ do_test (9, 15, hlen, klen, 1);
+
+ do_test (15, 0, hlen, klen, 0);
+ do_test (15, 0, hlen, klen, 1);
+ do_test (15, 3, hlen, klen, 0);
+ do_test (15, 3, hlen, klen, 1);
+ do_test (15, 9, hlen, klen, 0);
+ do_test (15, 9, hlen, klen, 1);
+ do_test (15, 15, hlen, klen, 0);
+ do_test (15, 15, hlen, klen, 1);
+ }
+ do_test (0, 0, page_size - 1, 16, 0);
+ do_test (0, 0, page_size - 1, 16, 1);
+
+ return ret;
+}
+
+#include "../test-skeleton.c"
-----------------------------------------------------------------------
Summary of changes:
ChangeLog | 5 ++
benchtests/Makefile | 2 +-
benchtests/{bench-strsep.c => bench-strtok.c} | 77 +++++++++++++++++-------
3 files changed, 60 insertions(+), 24 deletions(-)
copy benchtests/{bench-strsep.c => bench-strtok.c} (80%)
hooks/post-receive
--
GNU C Library master sources