public inbox for libc-alpha@sourceware.org
 help / color / mirror / Atom feed
* [PATCH] build: All microbenchmarks should output in JSON. (bug 27740)
@ 2023-02-19 12:50 Girish Joshi
  2023-03-05  6:15 ` Girish Joshi
  0 siblings, 1 reply; 3+ messages in thread
From: Girish Joshi @ 2023-02-19 12:50 UTC (permalink / raw)
  To: Girish Joshi via Libc-alpha

[-- Attachment #1: Type: text/plain, Size: 630 bytes --]

Hello,
According to bug #27740 [1], I found that the following files need to
be updated.

    - benchtests/bench-memccpy.c
    - benchtests/bench-strcasestr.c
    - benchtests/bench-strcpy_chk.c
    - benchtests/bench-strsep.c
    - benchtests/bench-strtok.c

Also, the output json needs to be fixed in two files.
    - bench-math-inlines.c
    - bench-strcoll.c

This patch fixes both of these things.
The output is tested using
benchtests/scripts/compare_strings.py.

Please let me know if some correction is needed in this patch.

Thanks,
Girish Joshi
girishjoshi.io

[1]: https://sourceware.org/bugzilla/show_bug.cgi?id=27740

[-- Attachment #2: 0001-build-All-microbenchmarks-should-output-in-JSON.-bug.patch --]
[-- Type: text/x-patch, Size: 30167 bytes --]

From c8d1b68c8fc7cfb61d13f7321a7213cd1afb6d44 Mon Sep 17 00:00:00 2001
From: Girish Joshi <girish946@gmail.com>
Date: Sat, 15 Oct 2022 00:24:03 +0530
Subject: [PATCH] build: All microbenchmarks should output in JSON. (bug 27740)

This makes use of json-lib.h in
    - benchtests/bench-memccpy.c
    - benchtests/bench-strcasestr.c
    - benchtests/bench-strcpy_chk.c
    - benchtests/bench-strsep.c
    - benchtests/bench-strtok.c
to output to json.

This commit also fixes the json output generated by
bench-math-inlines.c and bench-strcoll.c

The output has been tested with
benchtests/scripts/compare_strings.py script.

Signed-off-by: Girish Joshi <girish946@gmail.com>
---
 benchtests/bench-math-inlines.c |   2 +
 benchtests/bench-memccpy.c      |  72 +++++++++++++------
 benchtests/bench-strcasestr.c   | 122 +++++++++++++++++++-------------
 benchtests/bench-strcoll.c      |   2 +
 benchtests/bench-strcpy_chk.c   | 107 +++++++++++++++++-----------
 benchtests/bench-strsep.c       | 122 ++++++++++++++++++++------------
 benchtests/bench-strtok.c       | 122 +++++++++++++++++++-------------
 7 files changed, 343 insertions(+), 206 deletions(-)

diff --git a/benchtests/bench-math-inlines.c b/benchtests/bench-math-inlines.c
index e755de1e28..cc49bcb869 100644
--- a/benchtests/bench-math-inlines.c
+++ b/benchtests/bench-math-inlines.c
@@ -248,6 +248,7 @@ test_main (void)
   bench_start ();
 
   json_init (&json_ctx, 2, stdout);
+  json_document_begin (&json_ctx);
   json_attr_object_begin (&json_ctx, TEST_NAME);
 
   /* Create 2 test arrays, one with 10% zeroes, 10% negative values,
@@ -278,6 +279,7 @@ test_main (void)
     }
 
   json_attr_object_end (&json_ctx);
+  json_document_end (&json_ctx);
   return 0;
 }
 
diff --git a/benchtests/bench-memccpy.c b/benchtests/bench-memccpy.c
index 51ed8dad2f..5302cacd0b 100644
--- a/benchtests/bench-memccpy.c
+++ b/benchtests/bench-memccpy.c
@@ -35,11 +35,13 @@ generic_memccpy (void *dst, const void *src, int c, size_t n)
 IMPL (memccpy, 1)
 IMPL (generic_memccpy, 0)
 
+#include "json-lib.h"
+
 typedef void *(*proto_t) (void *, const void *, int c, size_t);
 
 static void
-do_one_test (impl_t *impl, void *dst, const void *src, int c, size_t len,
-	     size_t n)
+do_one_test (json_ctx_t *json_ctx, impl_t *impl, void *dst, const void *src,
+   int c, size_t len, size_t n)
 {
   size_t i, iters = INNER_LOOP_ITERS_LARGE;
   timing_t start, stop, cur;
@@ -53,12 +55,12 @@ do_one_test (impl_t *impl, void *dst, const void *src, int c, size_t len,
 
   TIMING_DIFF (cur, start, stop);
 
-  TIMING_PRINT_MEAN ((double) cur, (double) iters);
+  json_element_double (json_ctx, (double) cur / (double) iters);
 }
 
 static void
-do_test (size_t align1, size_t align2, int c, size_t len, size_t n,
-	 int max_char)
+do_test (json_ctx_t *json_ctx, size_t align1, size_t align2, int c,
+   size_t len, size_t n, int max_char)
 {
   size_t i;
   char *s1, *s2;
@@ -84,46 +86,70 @@ do_test (size_t align1, size_t align2, int c, size_t len, size_t n,
   for (i = len; i + align1 < page_size && i < len + 64; ++i)
     s1[i] = 32 + 32 * i % (max_char - 32);
 
-  printf ("Length %4zd, n %4zd, char %d, alignment %2zd/%2zd:", len, n, c, align1, align2);
+  json_element_object_begin (json_ctx);
+  json_attr_uint (json_ctx, "length", (double) len);
+  json_attr_uint (json_ctx, "n", (double) n);
+  json_attr_uint (json_ctx, "c", (int) c);
+  json_attr_uint (json_ctx, "align1", (double) align1);
+  json_attr_uint (json_ctx, "align2", (double) align2);
+  json_array_begin (json_ctx, "timings");
 
   FOR_EACH_IMPL (impl, 0)
-    do_one_test (impl, s2, s1, c, len, n);
+    do_one_test (json_ctx, impl, s2, s1, c, len, n);
 
-  putchar ('\n');
+  json_array_end (json_ctx);
+  json_element_object_end (json_ctx);
 }
 
 int
 test_main (void)
 {
+  json_ctx_t json_ctx;
   size_t i;
 
   test_init ();
 
-  printf ("%28s", "");
+  json_init (&json_ctx, 0, stdout);
+
+  json_document_begin (&json_ctx);
+  json_attr_string (&json_ctx, "timing_type", TIMING_TYPE);
+
+  json_attr_object_begin (&json_ctx, "functions");
+  json_attr_object_begin (&json_ctx, TEST_NAME);
+  json_attr_string (&json_ctx, "bench-variant", "default");
+
+  json_array_begin (&json_ctx, "ifuncs");
+
   FOR_EACH_IMPL (impl, 0)
-    printf ("\t%s", impl->name);
-  putchar ('\n');
+    json_element_string (&json_ctx, impl->name);
+  json_array_end (&json_ctx);
 
+  json_array_begin (&json_ctx, "results");
   for (i = 1; i < 8; ++i)
     {
-      do_test (i, i, 12, 16, 16, 127);
-      do_test (i, i, 23, 16, 16, 255);
-      do_test (i, 2 * i, 28, 16, 16, 127);
-      do_test (2 * i, i, 31, 16, 16, 255);
-      do_test (8 - i, 2 * i, 1, 1 << i, 2 << i, 127);
-      do_test (2 * i, 8 - i, 17, 2 << i, 1 << i, 127);
-      do_test (8 - i, 2 * i, 0, 1 << i, 2 << i, 255);
-      do_test (2 * i, 8 - i, i, 2 << i, 1 << i, 255);
+      do_test (&json_ctx, i, i, 12, 16, 16, 127);
+      do_test (&json_ctx, i, i, 23, 16, 16, 255);
+      do_test (&json_ctx, i, 2 * i, 28, 16, 16, 127);
+      do_test (&json_ctx, 2 * i, i, 31, 16, 16, 255);
+      do_test (&json_ctx, 8 - i, 2 * i, 1, 1 << i, 2 << i, 127);
+      do_test (&json_ctx, 2 * i, 8 - i, 17, 2 << i, 1 << i, 127);
+      do_test (&json_ctx, 8 - i, 2 * i, 0, 1 << i, 2 << i, 255);
+      do_test (&json_ctx, 2 * i, 8 - i, i, 2 << i, 1 << i, 255);
     }
 
   for (i = 1; i < 8; ++i)
     {
-      do_test (0, 0, i, 4 << i, 8 << i, 127);
-      do_test (0, 0, i, 16 << i, 8 << i, 127);
-      do_test (8 - i, 2 * i, i, 4 << i, 8 << i, 127);
-      do_test (8 - i, 2 * i, i, 16 << i, 8 << i, 127);
+      do_test (&json_ctx, 0, 0, i, 4 << i, 8 << i, 127);
+      do_test (&json_ctx, 0, 0, i, 16 << i, 8 << i, 127);
+      do_test (&json_ctx, 8 - i, 2 * i, i, 4 << i, 8 << i, 127);
+      do_test (&json_ctx, 8 - i, 2 * i, i, 16 << i, 8 << i, 127);
     }
 
+  json_array_end (&json_ctx);
+  json_attr_object_end (&json_ctx);
+  json_attr_object_end (&json_ctx);
+  json_document_end (&json_ctx);
+
   return ret;
 }
 
diff --git a/benchtests/bench-strcasestr.c b/benchtests/bench-strcasestr.c
index b3b26406f9..a8bcfb3aec 100644
--- a/benchtests/bench-strcasestr.c
+++ b/benchtests/bench-strcasestr.c
@@ -32,9 +32,11 @@ typedef char *(*proto_t) (const char *, const char *);
 IMPL (simple_strcasestr, 0)
 IMPL (strcasestr, 1)
 
+# include "json-lib.h"
 
 static void
-do_one_test (impl_t *impl, const char *s1, const char *s2, char *exp_result)
+do_one_test (json_ctx_t *json_ctx, impl_t *impl, const char *s1,
+   const char *s2, char *exp_result)
 {
   size_t i, iters = INNER_LOOP_ITERS_SMALL;
   timing_t start, stop, cur;
@@ -48,13 +50,13 @@ do_one_test (impl_t *impl, const char *s1, const char *s2, char *exp_result)
 
   TIMING_DIFF (cur, start, stop);
 
-  TIMING_PRINT_MEAN ((double) cur, (double) iters);
+  json_element_double (json_ctx, (double) cur / (double) iters);
 }
 
 
 static void
-do_test (size_t align1, size_t align2, size_t len1, size_t len2,
-	 int fail)
+do_test (json_ctx_t *json_ctx, size_t align1, size_t align2, size_t len1,
+   size_t len2, int fail)
 {
   char *s1 = (char *) (buf1 + align1);
   char *s2 = (char *) (buf2 + align2);
@@ -88,67 +90,91 @@ do_test (size_t align1, size_t align2, size_t len1, size_t len2,
     }
   s1[len1] = '\0';
 
-  printf ("Length %4zd/%zd, alignment %2zd/%2zd, %s:",
-	  len1, len2, align1, align2, fail ? "fail" : "found");
+  json_element_object_begin (json_ctx);
+  json_attr_uint (json_ctx, "length1", (double) len1);
+  json_attr_uint (json_ctx, "length2", (double) len2);
+  json_attr_uint (json_ctx, "align1", (double) align1);
+  json_attr_uint (json_ctx, "align2", (double) align2);
+  json_attr_string (json_ctx, "fail", fail ? "fail" : "found");
+  json_array_begin (json_ctx, "timings");
 
   FOR_EACH_IMPL (impl, 0)
-    do_one_test (impl, s1, s2, fail ? NULL : s1 + len1 - len2);
+    do_one_test (json_ctx, impl, s1, s2, fail ? NULL : s1 + len1 - len2);
 
-  putchar ('\n');
+  json_array_end (json_ctx);
+  json_element_object_end (json_ctx);
 }
 
 static int
 test_main (void)
 {
+  json_ctx_t json_ctx;
+
   test_init ();
 
-  printf ("%23s", "");
+  json_init (&json_ctx, 0, stdout);
+
+  json_document_begin (&json_ctx);
+  json_attr_string (&json_ctx, "timing_type", TIMING_TYPE);
+
+  json_attr_object_begin (&json_ctx, "functions");
+  json_attr_object_begin (&json_ctx, TEST_NAME);
+  json_attr_string (&json_ctx, "bench-variant", "default");
+
+  json_array_begin (&json_ctx, "ifuncs");
+
   FOR_EACH_IMPL (impl, 0)
-    printf ("\t%s", impl->name);
-  putchar ('\n');
+    json_element_string(&json_ctx, impl->name); 
+  json_array_end (&json_ctx);
 
+  json_array_begin (&json_ctx, "results");
   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 (&json_ctx, 0, 0, hlen, klen, 0);
+	do_test (&json_ctx, 0, 0, hlen, klen, 1);
+	do_test (&json_ctx, 0, 3, hlen, klen, 0);
+	do_test (&json_ctx, 0, 3, hlen, klen, 1);
+	do_test (&json_ctx, 0, 9, hlen, klen, 0);
+	do_test (&json_ctx, 0, 9, hlen, klen, 1);
+	do_test (&json_ctx, 0, 15, hlen, klen, 0);
+	do_test (&json_ctx, 0, 15, hlen, klen, 1);
+
+	do_test (&json_ctx, 3, 0, hlen, klen, 0);
+	do_test (&json_ctx, 3, 0, hlen, klen, 1);
+	do_test (&json_ctx, 3, 3, hlen, klen, 0);
+	do_test (&json_ctx, 3, 3, hlen, klen, 1);
+	do_test (&json_ctx, 3, 9, hlen, klen, 0);
+	do_test (&json_ctx, 3, 9, hlen, klen, 1);
+	do_test (&json_ctx, 3, 15, hlen, klen, 0);
+	do_test (&json_ctx, 3, 15, hlen, klen, 1);
+
+	do_test (&json_ctx, 9, 0, hlen, klen, 0);
+	do_test (&json_ctx, 9, 0, hlen, klen, 1);
+	do_test (&json_ctx, 9, 3, hlen, klen, 0);
+	do_test (&json_ctx, 9, 3, hlen, klen, 1);
+	do_test (&json_ctx, 9, 9, hlen, klen, 0);
+	do_test (&json_ctx, 9, 9, hlen, klen, 1);
+	do_test (&json_ctx, 9, 15, hlen, klen, 0);
+	do_test (&json_ctx, 9, 15, hlen, klen, 1);
+
+	do_test (&json_ctx, 15, 0, hlen, klen, 0);
+	do_test (&json_ctx, 15, 0, hlen, klen, 1);
+	do_test (&json_ctx, 15, 3, hlen, klen, 0);
+	do_test (&json_ctx, 15, 3, hlen, klen, 1);
+	do_test (&json_ctx, 15, 9, hlen, klen, 0);
+	do_test (&json_ctx, 15, 9, hlen, klen, 1);
+	do_test (&json_ctx, 15, 15, hlen, klen, 0);
+	do_test (&json_ctx, 15, 15, hlen, klen, 1);
       }
 
-  do_test (0, 0, page_size - 1, 16, 0);
-  do_test (0, 0, page_size - 1, 16, 1);
+  do_test (&json_ctx, 0, 0, page_size - 1, 16, 0);
+  do_test (&json_ctx, 0, 0, page_size - 1, 16, 1);
+
+  json_array_end (&json_ctx);
+  json_attr_object_end (&json_ctx);
+  json_attr_object_end (&json_ctx);
+  json_document_end (&json_ctx);
 
   return ret;
 }
diff --git a/benchtests/bench-strcoll.c b/benchtests/bench-strcoll.c
index b3cd5ce8a9..08f81dea9e 100644
--- a/benchtests/bench-strcoll.c
+++ b/benchtests/bench-strcoll.c
@@ -239,6 +239,7 @@ main (void)
   json_ctx_t *json_ctx = malloc (sizeof (json_ctx_t));
   assert (json_ctx != NULL);
   json_init (json_ctx, 2, stdout);
+  json_document_begin (json_ctx);
   json_attr_object_begin (json_ctx, "strcoll");
 
   size_t i;
@@ -271,6 +272,7 @@ main (void)
 
 out:
   json_attr_object_end (json_ctx);
+  json_document_end (json_ctx);
   free (json_ctx);
   return result;
 }
diff --git a/benchtests/bench-strcpy_chk.c b/benchtests/bench-strcpy_chk.c
index 6fce90cc98..90842fac52 100644
--- a/benchtests/bench-strcpy_chk.c
+++ b/benchtests/bench-strcpy_chk.c
@@ -54,6 +54,7 @@ simple_strcpy_chk (char *dst, const char *src, size_t len)
 #include <signal.h>
 
 #include <support/support.h>
+#include "json-lib.h"
 
 volatile int chk_fail_ok;
 jmp_buf chk_fail_buf;
@@ -73,7 +74,7 @@ handler (int sig)
 typedef char *(*proto_t) (char *, const char *, size_t);
 
 static void
-do_one_test (impl_t *impl, char *dst, const char *src,
+do_one_test (json_ctx_t *json_ctx, impl_t *impl, char *dst, const char *src,
 	     size_t len, size_t dlen)
 {
   char *res;
@@ -124,11 +125,12 @@ do_one_test (impl_t *impl, char *dst, const char *src,
 
   TIMING_DIFF (cur, start, stop);
 
-  TIMING_PRINT_MEAN ((double) cur, (double) iters);
+  json_element_double (json_ctx, (double) cur / (double) iters);
 }
 
 static void
-do_test (size_t align1, size_t align2, size_t len, size_t dlen, int max_char)
+do_test (json_ctx_t *json_ctx, size_t align1, size_t align2, size_t len,
+	 size_t dlen, int max_char)
 {
   size_t i;
   char *s1, *s2;
@@ -148,96 +150,119 @@ do_test (size_t align1, size_t align2, size_t len, size_t dlen, int max_char)
     s1[i] = 32 + 23 * i % (max_char - 32);
   s1[len] = 0;
 
-  if (dlen > len)
-    printf ("Length %4zd, alignment %2zd/%2zd:", len, align1, align2);
+  if (dlen > len){
+    json_element_object_begin (json_ctx);
+    json_attr_uint (json_ctx, "length", (double) len);
+    json_attr_uint (json_ctx, "align1", (double) align1);
+    json_attr_uint (json_ctx, "align2", (double) align2);
+    json_array_begin (json_ctx, "timings");
+  }
 
   FOR_EACH_IMPL (impl, 0)
-    do_one_test (impl, s2, s1, len, dlen);
+    do_one_test (json_ctx, impl, s2, s1, len, dlen);
 
-  if (dlen > len)
-    putchar ('\n');
+  if (dlen > len){
+    json_array_end (json_ctx);
+    json_element_object_end (json_ctx);
+  }
 }
 
 static int
 test_main (void)
 {
+  json_ctx_t json_ctx;
   size_t i;
 
   set_fortify_handler (handler);
 
   test_init ();
+  json_init (&json_ctx, 0, stdout);
+
+  json_document_begin (&json_ctx);
+  json_attr_string (&json_ctx, "timing_type", TIMING_TYPE);
+
+  json_attr_object_begin (&json_ctx, "functions");
+  json_attr_object_begin (&json_ctx, TEST_NAME);
+  json_attr_string (&json_ctx, "bench-variant", "default");
+
+  json_array_begin (&json_ctx, "ifuncs");
 
-  printf ("%23s", "");
   FOR_EACH_IMPL (impl, 0)
-    printf ("\t%s", impl->name);
-  putchar ('\n');
+    json_element_string (&json_ctx, impl->name);
+  json_array_end (&json_ctx);
 
+  json_array_begin (&json_ctx, "results");
   for (i = 0; i < 16; ++i)
     {
-      do_test (0, 0, i, i + 1, 127);
-      do_test (0, 0, i, i + 1, 255);
-      do_test (0, i, i, i + 1, 127);
-      do_test (i, 0, i, i + 1, 255);
+      do_test (&json_ctx, 0, 0, i, i + 1, 127);
+      do_test (&json_ctx, 0, 0, i, i + 1, 255);
+      do_test (&json_ctx, 0, i, i, i + 1, 127);
+      do_test (&json_ctx, i, 0, i, i + 1, 255);
     }
 
   for (i = 1; i < 8; ++i)
     {
-      do_test (0, 0, 8 << i, (8 << i) + 1, 127);
-      do_test (8 - i, 2 * i, (8 << i), (8 << i) + 1, 127);
+      do_test (&json_ctx, 0, 0, 8 << i, (8 << i) + 1, 127);
+      do_test (&json_ctx, 8 - i, 2 * i, (8 << i), (8 << i) + 1, 127);
     }
 
   for (i = 1; i < 8; ++i)
     {
-      do_test (i, 2 * i, (8 << i), (8 << i) + 1, 127);
-      do_test (2 * i, i, (8 << i), (8 << i) + 1, 255);
-      do_test (i, i, (8 << i), (8 << i) + 1, 127);
-      do_test (i, i, (8 << i), (8 << i) + 1, 255);
+      do_test (&json_ctx, i, 2 * i, (8 << i), (8 << i) + 1, 127);
+      do_test (&json_ctx, 2 * i, i, (8 << i), (8 << i) + 1, 255);
+      do_test (&json_ctx, i, i, (8 << i), (8 << i) + 1, 127);
+      do_test (&json_ctx, i, i, (8 << i), (8 << i) + 1, 255);
     }
 
   for (i = 0; i < 16; ++i)
     {
-      do_test (0, 0, i, i + 256, 127);
-      do_test (0, 0, i, i + 256, 255);
-      do_test (0, i, i, i + 256, 127);
-      do_test (i, 0, i, i + 256, 255);
+      do_test (&json_ctx, 0, 0, i, i + 256, 127);
+      do_test (&json_ctx, 0, 0, i, i + 256, 255);
+      do_test (&json_ctx, 0, i, i, i + 256, 127);
+      do_test (&json_ctx, i, 0, i, i + 256, 255);
     }
 
   for (i = 1; i < 8; ++i)
     {
-      do_test (0, 0, 8 << i, (8 << i) + 256, 127);
-      do_test (8 - i, 2 * i, (8 << i), (8 << i) + 256, 127);
+      do_test (&json_ctx, 0, 0, 8 << i, (8 << i) + 256, 127);
+      do_test (&json_ctx, 8 - i, 2 * i, (8 << i), (8 << i) + 256, 127);
     }
 
   for (i = 1; i < 8; ++i)
     {
-      do_test (i, 2 * i, (8 << i), (8 << i) + 256, 127);
-      do_test (2 * i, i, (8 << i), (8 << i) + 256, 255);
-      do_test (i, i, (8 << i), (8 << i) + 256, 127);
-      do_test (i, i, (8 << i), (8 << i) + 256, 255);
+      do_test (&json_ctx, i, 2 * i, (8 << i), (8 << i) + 256, 127);
+      do_test (&json_ctx, 2 * i, i, (8 << i), (8 << i) + 256, 255);
+      do_test (&json_ctx, i, i, (8 << i), (8 << i) + 256, 127);
+      do_test (&json_ctx, i, i, (8 << i), (8 << i) + 256, 255);
     }
 
   for (i = 0; i < 16; ++i)
     {
-      do_test (0, 0, i, i, 127);
-      do_test (0, 0, i, i + 2, 255);
-      do_test (0, i, i, i + 3, 127);
-      do_test (i, 0, i, i + 4, 255);
+      do_test (&json_ctx, 0, 0, i, i, 127);
+      do_test (&json_ctx, 0, 0, i, i + 2, 255);
+      do_test (&json_ctx, 0, i, i, i + 3, 127);
+      do_test (&json_ctx, i, 0, i, i + 4, 255);
     }
 
   for (i = 1; i < 8; ++i)
     {
-      do_test (0, 0, 8 << i, (8 << i) - 15, 127);
-      do_test (8 - i, 2 * i, (8 << i), (8 << i) + 5, 127);
+      do_test (&json_ctx, 0, 0, 8 << i, (8 << i) - 15, 127);
+      do_test (&json_ctx, 8 - i, 2 * i, (8 << i), (8 << i) + 5, 127);
     }
 
   for (i = 1; i < 8; ++i)
     {
-      do_test (i, 2 * i, (8 << i), (8 << i) + i, 127);
-      do_test (2 * i, i, (8 << i), (8 << i) + (i - 1), 255);
-      do_test (i, i, (8 << i), (8 << i) + i + 2, 127);
-      do_test (i, i, (8 << i), (8 << i) + i + 3, 255);
+      do_test (&json_ctx, i, 2 * i, (8 << i), (8 << i) + i, 127);
+      do_test (&json_ctx, 2 * i, i, (8 << i), (8 << i) + (i - 1), 255);
+      do_test (&json_ctx, i, i, (8 << i), (8 << i) + i + 2, 127);
+      do_test (&json_ctx, i, i, (8 << i), (8 << i) + i + 3, 255);
     }
 
+  json_array_end (&json_ctx);
+  json_attr_object_end (&json_ctx);
+  json_attr_object_end (&json_ctx);
+  json_document_end (&json_ctx);
+
   return 0;
 }
 
diff --git a/benchtests/bench-strsep.c b/benchtests/bench-strsep.c
index 4b203aff30..708689b498 100644
--- a/benchtests/bench-strsep.c
+++ b/benchtests/bench-strsep.c
@@ -20,6 +20,8 @@
 #define TEST_NAME "strsep"
 #include "bench-string.h"
 
+# include "json-lib.h"
+
 char *
 simple_strsep (char **s1, char *s2)
 {
@@ -101,7 +103,8 @@ IMPL (strsep, 1)
 IMPL (oldstrsep, 2)
 
 static void
-do_one_test (impl_t * impl, const char *s1, const char *s2)
+do_one_test (json_ctx_t *json_ctx, impl_t * impl, const char *s1,
+   const char *s2)
 {
   size_t i, iters = INNER_LOOP_ITERS_SMALL;
   timing_t start, stop, cur;
@@ -118,11 +121,12 @@ do_one_test (impl_t * impl, const char *s1, const char *s2)
 
   TIMING_DIFF (cur, start, stop);
 
-  TIMING_PRINT_MEAN ((double) cur, (double) iters);
+  json_element_double (json_ctx, (double) cur / (double) iters);
 }
 
 static void
-do_test (size_t align1, size_t align2, size_t len1, size_t len2, int fail)
+do_test (json_ctx_t *json_ctx, size_t align1, size_t align2, size_t len1,
+   size_t len2, int fail)
 {
   char *s2 = (char *) (buf2 + align2);
 
@@ -138,8 +142,13 @@ do_test (size_t align1, size_t align2, size_t len1, size_t len2, int fail)
     }
   s2[len2] = '\0';
 
-  printf ("Length %4zd/%zd, alignment %2zd/%2zd, %s:",
-	  len1, len2, align1, align2, fail ? "fail" : "found");
+  json_element_object_begin (json_ctx);
+  json_attr_uint (json_ctx, "length1", (double) len1);
+  json_attr_uint (json_ctx, "length2", (double) len2);
+  json_attr_uint (json_ctx, "align1", (double) align1);
+  json_attr_uint (json_ctx, "align2", (double) align2);
+  json_attr_string  (json_ctx, "fail", fail ? "fail" : "found");
+  json_array_begin (json_ctx, "timings");
 
   FOR_EACH_IMPL (impl, 0)
   {
@@ -148,62 +157,83 @@ do_test (size_t align1, size_t align2, size_t len1, size_t len2, int fail)
     if (!fail)
       s1[len1 / 2] = '1';
     s1[len1] = '\0';
-    do_one_test (impl, s1, s2);
+    do_one_test (json_ctx, impl, s1, s2);
   }
-  putchar ('\n');
+
+  json_array_end (json_ctx);
+  json_element_object_end (json_ctx);
 }
 
 static int
 test_main (void)
 {
+  json_ctx_t json_ctx;
+
   test_init ();
 
+  json_init (&json_ctx, 0, stdout);
+
+  json_document_begin (&json_ctx);
+  json_attr_string (&json_ctx, "timing_type", TIMING_TYPE);
+
+  json_attr_object_begin (&json_ctx, "functions");
+  json_attr_object_begin (&json_ctx, TEST_NAME);
+  json_attr_string (&json_ctx, "bench-variant", "default");
+
+  json_array_begin (&json_ctx, "ifuncs");
+
   printf ("%23s", "");
   FOR_EACH_IMPL (impl, 0)
-    printf ("\t%s", impl->name);
-  putchar ('\n');
+    json_element_string (&json_ctx, impl->name);
+  json_array_end (&json_ctx);
 
+  json_array_begin (&json_ctx, "results");
   for (size_t klen = 2; klen < 32; ++klen)
     for (size_t hlen = 4 * klen; hlen < 8 * 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 (&json_ctx, 0, 0, hlen, klen, 0);
+	do_test (&json_ctx, 0, 0, hlen, klen, 1);
+	do_test (&json_ctx, 0, 3, hlen, klen, 0);
+	do_test (&json_ctx, 0, 3, hlen, klen, 1);
+	do_test (&json_ctx, 0, 9, hlen, klen, 0);
+	do_test (&json_ctx, 0, 9, hlen, klen, 1);
+	do_test (&json_ctx, 0, 15, hlen, klen, 0);
+	do_test (&json_ctx, 0, 15, hlen, klen, 1);
+
+	do_test (&json_ctx, 3, 0, hlen, klen, 0);
+	do_test (&json_ctx, 3, 0, hlen, klen, 1);
+	do_test (&json_ctx, 3, 3, hlen, klen, 0);
+	do_test (&json_ctx, 3, 3, hlen, klen, 1);
+	do_test (&json_ctx, 3, 9, hlen, klen, 0);
+	do_test (&json_ctx, 3, 9, hlen, klen, 1);
+	do_test (&json_ctx, 3, 15, hlen, klen, 0);
+	do_test (&json_ctx, 3, 15, hlen, klen, 1);
+
+	do_test (&json_ctx, 9, 0, hlen, klen, 0);
+	do_test (&json_ctx, 9, 0, hlen, klen, 1);
+	do_test (&json_ctx, 9, 3, hlen, klen, 0);
+	do_test (&json_ctx, 9, 3, hlen, klen, 1);
+	do_test (&json_ctx, 9, 9, hlen, klen, 0);
+	do_test (&json_ctx, 9, 9, hlen, klen, 1);
+	do_test (&json_ctx, 9, 15, hlen, klen, 0);
+	do_test (&json_ctx, 9, 15, hlen, klen, 1);
+
+	do_test (&json_ctx, 15, 0, hlen, klen, 0);
+	do_test (&json_ctx, 15, 0, hlen, klen, 1);
+	do_test (&json_ctx, 15, 3, hlen, klen, 0);
+	do_test (&json_ctx, 15, 3, hlen, klen, 1);
+	do_test (&json_ctx, 15, 9, hlen, klen, 0);
+	do_test (&json_ctx, 15, 9, hlen, klen, 1);
+	do_test (&json_ctx, 15, 15, hlen, klen, 0);
+	do_test (&json_ctx, 15, 15, hlen, klen, 1);
       }
-  do_test (0, 0, page_size - 1, 16, 0);
-  do_test (0, 0, page_size - 1, 16, 1);
+  do_test (&json_ctx, 0, 0, page_size - 1, 16, 0);
+  do_test (&json_ctx, 0, 0, page_size - 1, 16, 1);
+
+  json_array_end (&json_ctx);
+  json_attr_object_end (&json_ctx);
+  json_attr_object_end (&json_ctx);
+  json_document_end (&json_ctx);
 
   return ret;
 }
diff --git a/benchtests/bench-strtok.c b/benchtests/bench-strtok.c
index 711bdaab58..4a4df16f41 100644
--- a/benchtests/bench-strtok.c
+++ b/benchtests/bench-strtok.c
@@ -57,8 +57,11 @@ typedef char *(*proto_t) (const char *, const char *);
 IMPL (oldstrtok, 0)
 IMPL (strtok, 1)
 
+# include "json-lib.h"
+
 static void
-do_one_test (impl_t * impl, const char *s1, const char *s2)
+do_one_test (json_ctx_t *json_ctx, impl_t * impl, const char *s1,
+   const char *s2)
 {
   size_t i, iters = INNER_LOOP_ITERS_SMALL;
   timing_t start, stop, cur;
@@ -73,13 +76,13 @@ do_one_test (impl_t * impl, const char *s1, const char *s2)
 
   TIMING_DIFF (cur, start, stop);
 
-  TIMING_PRINT_MEAN ((double) cur, (double) iters);
-
+  json_element_double (json_ctx, (double) cur / (double) iters);
 }
 
 
 static void
-do_test (size_t align1, size_t align2, size_t len1, size_t len2, int fail)
+do_test (json_ctx_t *json_ctx, size_t align1, size_t align2, size_t len1,
+   size_t len2, int fail)
 {
   char *s2 = (char *) (buf2 + align2);
   static const char d[] = "1234567890abcdef";
@@ -92,8 +95,13 @@ do_test (size_t align1, size_t align2, size_t len1, size_t len2, int fail)
     }
   s2[len2] = '\0';
 
-  printf ("Length %4zd/%zd, alignment %2zd/%2zd, %s:",
-	  len1, len2, align1, align2, fail ? "fail" : "found");
+  json_element_object_begin (json_ctx);
+  json_attr_uint (json_ctx, "length1", (double) len1);
+  json_attr_uint (json_ctx, "length2", (double) len2);
+  json_attr_uint (json_ctx, "align1", (double) align1);
+  json_attr_uint (json_ctx, "align2", (double) align2);
+  json_attr_string (json_ctx, "fail", fail ? "fail" : "found");
+  json_array_begin (json_ctx, "timings");
 
   FOR_EACH_IMPL (impl, 0)
   {
@@ -117,62 +125,80 @@ do_test (size_t align1, size_t align2, size_t len1, size_t len2, int fail)
 	  memcpy (s1 + (len1 - len2) - (3 * len2), s2, len2);
       }
     s1[len1] = '\0';
-    do_one_test (impl, s1, s2);
+    do_one_test (json_ctx, impl, s1, s2);
   }
-  putchar ('\n');
+
+  json_array_end (json_ctx);
+  json_element_object_end (json_ctx);
 }
 
 static int
 test_main (void)
 {
+  json_ctx_t json_ctx;
   test_init ();
 
-  printf ("%23s", "");
+  json_init (&json_ctx, 0, stdout);
+
+  json_document_begin (&json_ctx);
+  json_attr_string (&json_ctx, "timing_type", TIMING_TYPE);
+
+  json_attr_object_begin (&json_ctx, "functions");
+  json_attr_object_begin (&json_ctx, TEST_NAME);
+  json_attr_string (&json_ctx, "bench-variant", "default");
+
+  json_array_begin (&json_ctx, "ifuncs");
   FOR_EACH_IMPL (impl, 0)
-    printf ("\t%s", impl->name);
-  putchar ('\n');
+    json_element_string (&json_ctx, impl->name);
+  json_array_end (&json_ctx);
 
+  json_array_begin (&json_ctx, "results");
   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 (&json_ctx, 0, 0, hlen, klen, 0);
+	do_test (&json_ctx, 0, 0, hlen, klen, 1);
+	do_test (&json_ctx, 0, 3, hlen, klen, 0);
+	do_test (&json_ctx, 0, 3, hlen, klen, 1);
+	do_test (&json_ctx, 0, 9, hlen, klen, 0);
+	do_test (&json_ctx, 0, 9, hlen, klen, 1);
+	do_test (&json_ctx, 0, 15, hlen, klen, 0);
+	do_test (&json_ctx, 0, 15, hlen, klen, 1);
+
+	do_test (&json_ctx, 3, 0, hlen, klen, 0);
+	do_test (&json_ctx, 3, 0, hlen, klen, 1);
+	do_test (&json_ctx, 3, 3, hlen, klen, 0);
+	do_test (&json_ctx, 3, 3, hlen, klen, 1);
+	do_test (&json_ctx, 3, 9, hlen, klen, 0);
+	do_test (&json_ctx, 3, 9, hlen, klen, 1);
+	do_test (&json_ctx, 3, 15, hlen, klen, 0);
+	do_test (&json_ctx, 3, 15, hlen, klen, 1);
+
+	do_test (&json_ctx, 9, 0, hlen, klen, 0);
+	do_test (&json_ctx, 9, 0, hlen, klen, 1);
+	do_test (&json_ctx, 9, 3, hlen, klen, 0);
+	do_test (&json_ctx, 9, 3, hlen, klen, 1);
+	do_test (&json_ctx, 9, 9, hlen, klen, 0);
+	do_test (&json_ctx, 9, 9, hlen, klen, 1);
+	do_test (&json_ctx, 9, 15, hlen, klen, 0);
+	do_test (&json_ctx, 9, 15, hlen, klen, 1);
+
+	do_test (&json_ctx, 15, 0, hlen, klen, 0);
+	do_test (&json_ctx, 15, 0, hlen, klen, 1);
+	do_test (&json_ctx, 15, 3, hlen, klen, 0);
+	do_test (&json_ctx, 15, 3, hlen, klen, 1);
+	do_test (&json_ctx, 15, 9, hlen, klen, 0);
+	do_test (&json_ctx, 15, 9, hlen, klen, 1);
+	do_test (&json_ctx, 15, 15, hlen, klen, 0);
+	do_test (&json_ctx, 15, 15, hlen, klen, 1);
       }
-  do_test (0, 0, page_size - 1, 16, 0);
-  do_test (0, 0, page_size - 1, 16, 1);
+  do_test (&json_ctx, 0, 0, page_size - 1, 16, 0);
+  do_test (&json_ctx, 0, 0, page_size - 1, 16, 1);
+
+  json_array_end (&json_ctx);
+  json_attr_object_end (&json_ctx);
+  json_attr_object_end (&json_ctx);
+  json_document_end (&json_ctx);
 
   return ret;
 }
-- 
2.39.1


^ permalink raw reply	[flat|nested] 3+ messages in thread

* Re: [PATCH] build: All microbenchmarks should output in JSON. (bug 27740)
  2023-02-19 12:50 [PATCH] build: All microbenchmarks should output in JSON. (bug 27740) Girish Joshi
@ 2023-03-05  6:15 ` Girish Joshi
  2023-03-05 18:18   ` Noah Goldstein
  0 siblings, 1 reply; 3+ messages in thread
From: Girish Joshi @ 2023-03-05  6:15 UTC (permalink / raw)
  To: Girish Joshi via Libc-alpha, Siddhesh Poyarekar

Ping.

Girish Joshi


On Sun, Feb 19, 2023 at 6:20 PM Girish Joshi <girish946@gmail.com> wrote:
>
> Hello,
> According to bug #27740 [1], I found that the following files need to
> be updated.
>
>     - benchtests/bench-memccpy.c
>     - benchtests/bench-strcasestr.c
>     - benchtests/bench-strcpy_chk.c
>     - benchtests/bench-strsep.c
>     - benchtests/bench-strtok.c
>
> Also, the output json needs to be fixed in two files.
>     - bench-math-inlines.c
>     - bench-strcoll.c
>
> This patch fixes both of these things.
> The output is tested using
> benchtests/scripts/compare_strings.py.
>
> Please let me know if some correction is needed in this patch.
>
> Thanks,
> Girish Joshi
> girishjoshi.io
>
> [1]: https://sourceware.org/bugzilla/show_bug.cgi?id=27740

^ permalink raw reply	[flat|nested] 3+ messages in thread

* Re: [PATCH] build: All microbenchmarks should output in JSON. (bug 27740)
  2023-03-05  6:15 ` Girish Joshi
@ 2023-03-05 18:18   ` Noah Goldstein
  0 siblings, 0 replies; 3+ messages in thread
From: Noah Goldstein @ 2023-03-05 18:18 UTC (permalink / raw)
  To: Girish Joshi; +Cc: Girish Joshi via Libc-alpha, Siddhesh Poyarekar

On Sun, Mar 5, 2023 at 12:15 AM Girish Joshi via Libc-alpha
<libc-alpha@sourceware.org> wrote:
>
> Ping.
>
> Girish Joshi
>
>
> On Sun, Feb 19, 2023 at 6:20 PM Girish Joshi <girish946@gmail.com> wrote:
> >
> > Hello,
> > According to bug #27740 [1], I found that the following files need to
> > be updated.
> >
> >     - benchtests/bench-memccpy.c
> >     - benchtests/bench-strcasestr.c
> >     - benchtests/bench-strcpy_chk.c
> >     - benchtests/bench-strsep.c
> >     - benchtests/bench-strtok.c
> >
> > Also, the output json needs to be fixed in two files.
> >     - bench-math-inlines.c
> >     - bench-strcoll.c
> >
> > This patch fixes both of these things.
> > The output is tested using
> > benchtests/scripts/compare_strings.py.
> >
> > Please let me know if some correction is needed in this patch.

When applying:
```
Applying: build: All microbenchmarks should output in JSON. (bug 27740)
.git/rebase-apply/patch:235: trailing whitespace.
    json_element_string(&json_ctx, impl->name);
warning: 1 line adds whitespace errors.
```

Also can you please post the patch as inline text in the email? It
allows patchwork
to detect it and easier to inline comments during review.

Some general feedback:
1) The changes to `benchtests/bench-math-inlines.c`/`benchtests/bench-strcoll.c`
seem unrelated, can you make that a seperate patch.
2) You are missing some test parameters in most of the files (mostly `max_char`)
also `dlen` in `bench_strcpy_chk.c`. Can you make sure you get all of them that
are relevant to the input.

> >
> > Thanks,
> > Girish Joshi
> > girishjoshi.io
> >
> > [1]: https://sourceware.org/bugzilla/show_bug.cgi?id=27740

^ permalink raw reply	[flat|nested] 3+ messages in thread

end of thread, other threads:[~2023-03-05 18:18 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2023-02-19 12:50 [PATCH] build: All microbenchmarks should output in JSON. (bug 27740) Girish Joshi
2023-03-05  6:15 ` Girish Joshi
2023-03-05 18:18   ` Noah Goldstein

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).