[PATCH v3] benchtest: malloc tcache hotpath benchtest.

Cupertino Miranda cupertino.miranda@oracle.com
Thu May 8 16:52:22 GMT 2025


Hi Wilco,

On 08-05-2025 16:30, Wilco Dijkstra wrote:
> Hi Cupertino,
> 
> This looks much better, a few minor comments below. A question, how solid are
> the results of repeated runs on your system?
Results were quiet stable compared with previous benchtests.

  If it still varies a bit, you could try
> adding bench_start () from bench-util.c/h - this is used to increase frequency if
> you didn't disable frequency scaling.
Is there a way to lower frequency instead?
I would rather make it slower to minimize throttling from overheating in 
not so well cooled systems.

I will look this up and send a v4 really soon.

Thanks,
Cupertino

> 
> Cheers,
> Wilco
> 
> +/* Benchmark duration in seconds.  */
> +#define BENCHMARK_DURATION     10
> 
> 10 seconds is excessive, I'd reduce this to 2-3 seconds.
> 
> +/* Allocate and free blocks in a random order.  */
> +static size_t
> +malloc_benchmark_loop (void)
> +{
> +  size_t iters = 0;
> +  void *elem = NULL;
> +
> +  while (!timeout)
> +    {
> +      elem = TEST_FUNC (alloc_size);
> +      free (elem);
> +      iters++;
> +    }
> +
> +  return iters;
> +}
> 
> So this measures latency of dependent malloc/free - I think it is more
> realistic to measure throughput. It's best to unroll this and either do
> 4x malloc, 4x free or 4x malloc+free of different block sizes.
> 
> +static void usage(const char *name)
> +{
> +  fprintf (stderr, "%s: <alloc_size>\n", name);
> +  exit (1);
> +}
> 
> Missing line break.
> 
> +int
> +main (int argc, char **argv)
> +{
> +  timing_t cur;
> +  size_t iters = 0;
> +  json_ctx_t json_ctx;
> +  double d_total_s, d_total_i;
> +  struct sigaction act;
> +
> +  if (argc == 1)
> +    alloc_size = 1024;
> +  else if (argc == 2)
> +    {
> +      long ret;
> +
> +      errno = 0;
> +      ret = strtol(argv[1], NULL, 10);
> 
> Space before '('
> 
> +
> +      if (errno || ret == 0)
> +       usage(argv[0]);
> 
> And here
> 
> +      alloc_size = ret;
> +    }
> +  else
> +    usage(argv[0]);
> 
> And here
> 
> +  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_object_begin (&json_ctx, "");
> +
> +  memset (&act, 0, sizeof (act));
> +  act.sa_handler = &alarm_handler;
> +
> +  sigaction (SIGALRM, &act, NULL);
> +
> +  alarm (BENCHMARK_DURATION);
> +
> +  cur = do_benchmark (&iters);
> +
> +  struct rusage usage;
> +  getrusage(RUSAGE_SELF, &usage);
> 
> Dead code...
> 
> +  d_total_s = cur;
> +  d_total_i = iters;
> +
> +  json_attr_double (&json_ctx, "duration", d_total_s);
> +  json_attr_double (&json_ctx, "iterations", d_total_i);
> +  json_attr_double (&json_ctx, "time_per_iteration", d_total_s / d_total_i);
> +
> +  json_attr_object_end (&json_ctx);
> +
> +  json_attr_object_end (&json_ctx);
> +
> +  json_attr_object_end (&json_ctx);
> +
> +  json_document_end (&json_ctx);
> +
> +  return 0;
> +}
> --
> 2.39.5



More information about the Libc-alpha mailing list