From patchwork Sun Feb 19 12:50:46 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Girish Joshi X-Patchwork-Id: 65255 Return-Path: X-Original-To: patchwork@sourceware.org Delivered-To: patchwork@sourceware.org Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id 4428E384690B for ; Mon, 20 Feb 2023 12:01:55 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 4428E384690B DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=sourceware.org; s=default; t=1676894515; bh=PIMIpvnRLHpkIf90dxM/K+EJAFIvgqUf9JLAAx/VGkI=; h=Date:Subject:To:List-Id:List-Unsubscribe:List-Archive:List-Post: List-Help:List-Subscribe:From:Reply-To:From; b=qJ8Khu4qeMoHUOiAHEj36vLBJSnyEpR+BH0u/Eo7Ji/ieuU8H05IhuT9wATuYQuzY z/4K95Bo7q5YOuwq5WPxAz4lh2uyfIh5e4uc64ULHM+Tvh3XF/o8EcjxeAeqAewnEC xscELSzL5+o8yLbpjEA7SU1qAVmIY6lwLDg3GOrg= X-Original-To: libc-alpha@sourceware.org Delivered-To: libc-alpha@sourceware.org Received: from mail-vs1-xe35.google.com (mail-vs1-xe35.google.com [IPv6:2607:f8b0:4864:20::e35]) by sourceware.org (Postfix) with ESMTPS id 58E9D385802F for ; Mon, 20 Feb 2023 12:01:28 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org 58E9D385802F Received: by mail-vs1-xe35.google.com with SMTP id b20so151476vsq.4 for ; Mon, 20 Feb 2023 04:01:28 -0800 (PST) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; t=1676894487; h=to:subject:message-id:date:from:mime-version:x-gm-message-state :from:to:cc:subject:date:message-id:reply-to; bh=PIMIpvnRLHpkIf90dxM/K+EJAFIvgqUf9JLAAx/VGkI=; b=O+9fz9Zk868myX+xwRPIdFleiT4M6JU7qBac/yqoAH9KECQ2LLCMXrGr8Ruglkmzlb +vEWwOzQ3thqB2oPxfXXctycdEWpHb/JpH1q5s2ZYEWb4ZYbrnQIYJ2joN647owfMj2P d/wxRw7zR/u3u2GwasjRcuX35k4byudewXC3Fn9SzVq3EGJao1DkwYVOhtyTh6TsIvzL iGQ724/GiEJrc06YpJiFiA5+1zTFbzLdw55ZhnqTFLThtB69X30KZXE8sPbUlPg7yJ1B 96kvIAblGABIUkyzUUXRQyfD3waUrdLOEL6oVhcTJeW5B+iPt5RDI00KD9qdjNr0/6XS ufUw== X-Gm-Message-State: AO0yUKXWPCDm2ntWWiFSPyFLdbUfamjWutOFGiKd/uxHM5ivMYRl8lOQ ngwDzi1SCFfV+jg76jbdsQe7NEAZXFTMyA3lxAiRG2GJlZw= X-Google-Smtp-Source: AK7set/Jn5XK+dV9zA3np+UNKK9jzWlXdMFWgCdHK4MzyFWEwJjEog1wFmPI72gBv+j+qV16hJVQbNDk20bFRadF6gA= X-Received: by 2002:a0c:df04:0:b0:56e:cbcd:63f4 with SMTP id g4-20020a0cdf04000000b0056ecbcd63f4mr135162qvl.53.1676811058509; Sun, 19 Feb 2023 04:50:58 -0800 (PST) MIME-Version: 1.0 Date: Sun, 19 Feb 2023 18:20:46 +0530 Message-ID: Subject: [PATCH] build: All microbenchmarks should output in JSON. (bug 27740) To: Girish Joshi via Libc-alpha X-Spam-Status: No, score=-8.0 required=5.0 tests=BAYES_00, DATE_IN_PAST_12_24, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, DKIM_VALID_EF, FREEMAIL_ENVFROM_END_DIGIT, FREEMAIL_FROM, GIT_PATCH_0, RCVD_IN_DNSWL_NONE, SPF_HELO_NONE, SPF_PASS, TXREP autolearn=unavailable autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on server2.sourceware.org X-BeenThere: libc-alpha@sourceware.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Libc-alpha mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-Patchwork-Original-From: Girish Joshi via Libc-alpha From: Girish Joshi Reply-To: Girish Joshi Errors-To: libc-alpha-bounces+patchwork=sourceware.org@sourceware.org Sender: "Libc-alpha" 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 From c8d1b68c8fc7cfb61d13f7321a7213cd1afb6d44 Mon Sep 17 00:00:00 2001 From: Girish Joshi 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 --- 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 #include +#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