From 15cf093f7d6152d4b13553594e8f58d0312c0403 Mon Sep 17 00:00:00 2001 From: Andrew Kelley Date: Fri, 3 Jul 2020 18:31:41 +0000 Subject: [PATCH] add std.AutoHashMap benchmark see #2 --- benchmarks/manifest.json | 8 ++++++ benchmarks/std-hash-map/.gitignore | 2 ++ benchmarks/std-hash-map/main.zig | 44 ++++++++++++++++++++++++++++++ 3 files changed, 54 insertions(+) create mode 100644 benchmarks/std-hash-map/.gitignore create mode 100644 benchmarks/std-hash-map/main.zig diff --git a/benchmarks/manifest.json b/benchmarks/manifest.json index 7f2f1da..5683a68 100644 --- a/benchmarks/manifest.json +++ b/benchmarks/manifest.json @@ -50,5 +50,13 @@ "dir": "arena-allocator", "mainPath": "main.zig", "baselinePath": "main.zig" + }, + "std-hash-map": { + "description": "std.AutoHashMap - Project Euler 14", + "kind": "zig-bench", + "baseline": "feade9ef0010b1b47d7216e786ed964d09612c2b", + "dir": "std-hash-map", + "mainPath": "main.zig", + "baselinePath": "main.zig" } } diff --git a/benchmarks/std-hash-map/.gitignore b/benchmarks/std-hash-map/.gitignore new file mode 100644 index 0000000..26d7cfa --- /dev/null +++ b/benchmarks/std-hash-map/.gitignore @@ -0,0 +1,2 @@ +run +run.o diff --git a/benchmarks/std-hash-map/main.zig b/benchmarks/std-hash-map/main.zig new file mode 100644 index 0000000..216a4bb --- /dev/null +++ b/benchmarks/std-hash-map/main.zig @@ -0,0 +1,44 @@ +const std = @import("std"); +const bench = @import("root"); + +pub fn setup(gpa: *std.mem.Allocator, options: *bench.Options) !void { } + +pub fn run(gpa: *std.mem.Allocator, context: void) !void { + var cache = std.AutoHashMap(u64, u64).init(gpa); + defer cache.deinit(); + + try cache.ensureCapacity(2000000); + + var x: u64 = 0; + var maxx: u64 = 0; + var maxl: u64 = 0; + while (x < 1000000) : (x += 1) { + const l = length(&cache, x); + if (l > maxl) { + maxl = l; + maxx = x; + } + } + if (maxx != 837799) @panic("bad maxx"); + if (maxl != 524) @panic("bad maxl"); +} + +fn step(x: u64) u64 { + if (x & 1 > 0) { + return 3 * x + 1; + } else { + return x / 2; + } +} + +fn length(cache: *std.AutoHashMap(u64, u64), x: u64) u64 { + if (x <= 1) return 0; + if (cache.getValue(x)) |e| { + return e; + } else { + const next = step(x); + const len = 1 + length(cache, next); + cache.putAssumeCapacityNoClobber(x, len); + return len; + } +}