diff --git a/main.c b/main.c index 28a1203..42d89aa 100644 --- a/main.c +++ b/main.c @@ -27,6 +27,12 @@ #define PROG_UPDATEPRD 20 #define NPUZZLES 256U +struct bench_res { + double succ_rate; + double avg_time_us; + unsigned avg_passes; +}; + static uint32_t getseed(void) { FILE *urandom = fopen("/dev/urandom", "rb"); @@ -42,31 +48,37 @@ static uint32_t getseed(void) return seed; } -int main(void) +static void genpuzzles(struct sudoku puzzles_out[NPUZZLES], bool print_progress) { - uint32_t seed = getseed(); - printf("Seed: %u\n", seed); - srand(seed); - - struct sudoku puzzles[NPUZZLES]; unsigned i, j, bslen = 0; - fputs("Generating... ", stdout); + + if (print_progress) + fputs("Generating... ", stdout); + for (i = 0; i < NPUZZLES; ++i) { - if (i % PROG_UPDATEPRD == 0) { + if (print_progress && i % PROG_UPDATEPRD == 0) { for (j = 0; j < bslen; ++j) putchar('\b'); bslen = (unsigned)printf("%u%%", 100 * i / NPUZZLES); fflush(stdout); } - gen(&puzzles[i]); + gen(&puzzles_out[i]); } - for (j = 0; j < bslen; ++j) - putchar('\b'); - puts("100%"); + if (print_progress) { + for (i = 0; i < bslen; ++i) + putchar('\b'); + puts("100%"); + } +} + +static struct bench_res runbench(struct sudoku puzzles[NPUZZLES]) +{ int res[NPUZZLES]; + unsigned i; struct timespec start, end; + fputs("Solving... ", stdout); fflush(stdout); clock_gettime(CLOCK_PROCESS_CPUTIME_ID, &start); @@ -82,10 +94,8 @@ int main(void) nanos += 1000000000; } const double tot_micros = 1e6 * (double)secs + (double)nanos / 1e3; - const double avg_micros = tot_micros / NPUZZLES; - unsigned solved = 0; - unsigned tot_passes = 0; + unsigned solved = 0, tot_passes = 0; for (i = 0; i < NPUZZLES; ++i) { if (res[i] < 0) continue; @@ -93,13 +103,28 @@ int main(void) ++solved; tot_passes += (unsigned long)res[i]; } - const double succ_rate = (double)solved / NPUZZLES; - const unsigned avg_passes = tot_passes / NPUZZLES; + + return (struct bench_res) { + .succ_rate = (double)solved / NPUZZLES, + .avg_time_us = tot_micros / NPUZZLES, + .avg_passes = tot_passes / NPUZZLES, + }; +} + +int main(void) +{ + uint32_t seed = getseed(); + printf("Seed: %u\n", seed); + srand(seed); + + struct sudoku puzzles[NPUZZLES]; + genpuzzles(puzzles, true); + struct bench_res res = runbench(puzzles); puts("\n SUMMARY\n ======="); - printf("Success rate: %.0lf%%\n", 1e2 * succ_rate); - printf("Average time: %.3lf µs\n", avg_micros); - printf("Average n.o. passes: %u\n", avg_passes); + printf("Success rate: %.0lf%%\n", 1e2 * res.succ_rate); + printf("Average time: %.3lf µs\n", res.avg_time_us); + printf("Average n.o. passes: %u\n", res.avg_passes); return 0; }