[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