From fa9aecc045e9e7d0c2f4e182748491f732e63dd2 Mon Sep 17 00:00:00 2001 From: "H.J. Lu" Date: Thu, 16 May 2024 08:08:42 -0700 Subject: [PATCH] benchtests: Add fclose benchmark Measure duration of 100 fclose calls after opening 1 million FILEs. Signed-off-by: H.J. Lu Reviewed-by: Carlos O'Donell --- benchtests/Makefile | 6 ++++ benchtests/README | 1 + benchtests/bench-fclose.c | 75 +++++++++++++++++++++++++++++++++++++++ 3 files changed, 82 insertions(+) create mode 100644 benchtests/bench-fclose.c diff --git a/benchtests/Makefile b/benchtests/Makefile index 7e73b8504e..b74b5fe1ad 100644 --- a/benchtests/Makefile +++ b/benchtests/Makefile @@ -261,6 +261,10 @@ stdlib-benchset := \ strtod \ # stdlib-benchset +stdio-benchset := \ + fclose \ + # stdio-benchset + stdio-common-benchset := sprintf math-benchset := math-inlines @@ -269,6 +273,7 @@ ifeq (${BENCHSET},) benchset := \ $(hash-benchset) \ $(math-benchset) \ + $(stdio-benchset) \ $(stdio-common-benchset) \ $(stdlib-benchset) \ $(string-benchset-all) \ @@ -419,6 +424,7 @@ VALIDBENCHSETNAMES := \ malloc-simple \ malloc-thread \ math-benchset \ + stdio-benchset \ stdio-common-benchset \ stdlib-benchset \ string-benchset \ diff --git a/benchtests/README b/benchtests/README index 998ba9b2b4..15d014a407 100644 --- a/benchtests/README +++ b/benchtests/README @@ -87,6 +87,7 @@ where BENCHSET may be a space-separated list of the following values: hash-benchset malloc-thread math-benchset + stdio-benchset stdio-common-benchset stdlib-benchset string-benchset diff --git a/benchtests/bench-fclose.c b/benchtests/bench-fclose.c new file mode 100644 index 0000000000..5f1c103d4f --- /dev/null +++ b/benchtests/bench-fclose.c @@ -0,0 +1,75 @@ +/* Benchmark fclose. + Copyright (C) 2024 Free Software Foundation, Inc. + Copyright The GNU Toolchain Authors. + 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 + . */ + +#include +#include +#include +#include "bench-timing.h" +#include "json-lib.h" + +#define NUM_FILES 1000000 +#define NUM_FCLOSE 100 + +int +main (int argc, char **argv) +{ + json_ctx_t json_ctx; + 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, "fclose"); + + FILE *ff, *keep[NUM_FCLOSE]; + int i; + + for (i = 0; i < NUM_FILES; i++) + { + ff = fdopen (STDIN_FILENO, "r"); + if (!ff) + { + fprintf (stderr, "### failed to fdopen: %m\n"); + return EXIT_FAILURE; + } + if (i < NUM_FCLOSE) + keep[i] = ff; + } + + timing_t start, stop, elapsed; + + TIMING_NOW (start); + + for (i = 0; i < NUM_FCLOSE; i++) + fclose (keep[i]); + + TIMING_NOW (stop); + + TIMING_DIFF (elapsed, start, stop); + + json_attr_uint (&json_ctx, "number of FILEs", NUM_FILES); + json_attr_uint (&json_ctx, "number of fclose calls", NUM_FCLOSE); + json_attr_uint (&json_ctx, "duration", elapsed); + + json_attr_object_end (&json_ctx); + json_attr_object_end (&json_ctx); + json_document_end (&json_ctx); + + return 0; +}