open_memstream.c
1 #include <stdio.h> 2 #include <stdlib.h> 3 4 #include <darwintest.h> 5 #include <darwintest_perf.h> 6 7 static void 8 perf_fixed_size(size_t size_per_write) 9 { 10 dt_stat_time_t latency = dt_stat_time_create("write_latency", 11 "adding %zu bytes to a memstream", size_per_write); 12 dt_stat_set_variable_d(latency, "bytes", (double)size_per_write); 13 char *src = calloc(1, size_per_write); 14 T_QUIET; T_ASSERT_NOTNULL(src, "allocated source buffer"); 15 16 while (!dt_stat_stable(latency)) { 17 char *buf = NULL; 18 size_t size = 0; 19 20 FILE *victim = open_memstream(&buf, &size); 21 T_QUIET; T_WITH_ERRNO; T_ASSERT_NOTNULL(victim, "opened memstream"); 22 23 T_STAT_MEASURE_BATCH(latency) { 24 (void)fwrite(src, size_per_write, 1, victim); 25 } 26 27 fclose(victim); 28 T_QUIET; T_ASSERT_NOTNULL(buf, "buffer was set by open_memstream"); 29 T_QUIET; T_ASSERT_GE(size, size_per_write, 30 "memstream added non-zero bytes"); 31 32 free(buf); 33 } 34 35 free(src); 36 dt_stat_finalize(latency); 37 } 38 39 T_DECL(perf_open_memstream, "measure the performance of open_memstream") 40 { 41 size_t sizes[] = { 1, 8, 16, 64, 1024, 2048, 4096, 16 * 1024 }; 42 for (size_t i = 0; i < sizeof(sizes) / sizeof(sizes[0]); i++) { 43 perf_fixed_size(sizes[i]); 44 } 45 }