1
0
Advent-of-Code/benchmark.zig
2024-12-16 23:10:47 +01:00

155 lines
4.8 KiB
Zig

const std = @import("std");
const print = std.debug.print;
const d11 = @import("day1/part1.zig");
const d12 = @import("day1/part2.zig");
const d21 = @import("day2/part1.zig");
const d22 = @import("day2/part2.zig");
const d31 = @import("day3/part1.zig");
const d32 = @import("day3/part2.zig");
const d41 = @import("day4/part1.zig");
const d42 = @import("day4/part2.zig");
const d51 = @import("day5/part1.zig");
const d52 = @import("day5/part2.zig");
const d61 = @import("day6/part1.zig");
const d71 = @import("day7/part1.zig");
const d72 = @import("day7/part2.zig");
const d81 = @import("day8/part1.zig");
const d82 = @import("day8/part2.zig");
const d91 = @import("day9/part1.zig");
const d92 = @import("day9/part2.zig");
const d101 = @import("day10/part1.zig");
const d102 = @import("day10/part2.zig");
const d111 = @import("day11/part1.zig");
const d112 = @import("day11/part2.zig");
const d121 = @import("day12/part1.zig");
const d122 = @import("day12/part2.zig");
const d131 = @import("day13/part1.zig");
const d141 = @import("day14/part1.zig");
const d151 = @import("day15/part1.zig");
const d152 = @import("day15/part2.zig");
const d161 = @import("day16/part1.zig");
const NUMBER_OF_RUN = 50;
var total_mean: i64 = 0;
var total_min: i64 = 0;
var total_max: i64 = 0;
var total_std_dev: f64 = 0;
pub fn main() !void {
separator();
print("| Day | Part | Mean (μs) | Min (μs) | Max (μs) |\n", .{});
separator();
try benchmark(d11.main, 1, 1);
try benchmark(d12.main, 1, 2);
separator();
try benchmark(d21.main, 2, 1);
try benchmark(d22.main, 2, 2);
separator();
try benchmark(d31.main, 3, 1);
try benchmark(d32.main, 3, 2);
separator();
try benchmark(d42.main, 4, 1);
try benchmark(d42.main, 4, 2);
separator();
try benchmark(d51.main, 5, 1);
try benchmark(d52.main, 5, 2);
separator();
try benchmark(d61.main, 6, 1);
print("| 6 | 2 | Too long ~60s | 0 | 0 |\n", .{});
separator();
try benchmark(d71.main, 7, 1);
print("| 7 | 2 | Too long ~0.2s | 0 | 0 |\n", .{});
separator();
try benchmark(d81.main, 8, 1);
try benchmark(d82.main, 8, 2);
separator();
try benchmark(d91.main, 9, 1);
print("| 9 | 2 | Too long ~0.6s | 0 | 0 |\n", .{});
separator();
try benchmark(d101.main, 10, 1);
try benchmark(d102.main, 10, 2);
separator();
try benchmark(d111.main, 11, 1);
try benchmark(d112.main, 11, 2);
separator();
try benchmark(d121.main, 12, 1);
try benchmark(d122.main, 12, 2);
separator();
try benchmark(d131.main, 13, 1);
print("| 13 | 2 | Too long ~6h | 0 | 0 |\n", .{});
separator();
try benchmark(d141.main, 14, 1);
print("| 14 | 2 | Need input | 0 | 0 |\n", .{});
separator();
try benchmark(d151.main, 15, 1);
try benchmark(d152.main, 15, 2);
separator();
try benchmark(d161.main, 16, 1);
print("| 16 | 2 | Too long ~8s | 0 | 0 |\n", .{});
separator();
print("| Total | {d: >8} ± {d: <6.0} | {d:>8} | {d:>8} |\n", .{ total_mean, total_std_dev, total_min, total_max });
separator();
}
pub fn benchmark(func: anytype, day: u8, part: u8) !void {
var time_buff: [NUMBER_OF_RUN]i64 = undefined;
for (0..NUMBER_OF_RUN) |i| {
const time_start = std.time.microTimestamp();
try func();
time_buff[i] = std.time.microTimestamp() - time_start;
}
// Adjusted tabs for better alignment
print("| {d:<3} | {d:<4} | {d:>8} ± {d:<6.0} | {d:>8} | {d:>8} |\n", .{ day, part, mean(time_buff), std_dev(time_buff), min(time_buff), max(time_buff) });
total_mean += mean(time_buff);
total_min += min(time_buff);
total_max += max(time_buff);
total_std_dev += std_dev(time_buff);
}
pub fn separator() void {
print("|-----|------|-------------------|----------|----------|\n", .{});
}
fn min(array: [NUMBER_OF_RUN]i64) i64 {
var current_min: i64 = 999999999999;
for (array) |value| {
if (value < current_min) current_min = value;
}
return current_min;
}
fn max(array: [NUMBER_OF_RUN]i64) i64 {
var current_max: i64 = 0;
for (array) |value| {
if (value > current_max) current_max = value;
}
return current_max;
}
fn mean(array: [NUMBER_OF_RUN]i64) i64 {
var total: i64 = 0;
for (array) |value| {
total += value;
}
return @divFloor(total, NUMBER_OF_RUN);
}
fn variance(array: [NUMBER_OF_RUN]i64) i64 {
const m = mean(array);
var square_diff: i64 = 0;
for (array) |value| {
square_diff += (value - m) * (value - m);
}
return @divFloor(square_diff, NUMBER_OF_RUN);
}
fn std_dev(array: [NUMBER_OF_RUN]i64) f64 {
const vari = @as(f64, @floatFromInt(variance(array)));
return @sqrt(vari);
}