Skip to content

Commit 0c1d472

Browse files
authored
knucleotide: tune zig hash function and hash map load factor (#472)
1 parent 9e0389a commit 0c1d472

File tree

1 file changed

+14
-10
lines changed
  • bench/algorithm/knucleotide

1 file changed

+14
-10
lines changed

bench/algorithm/knucleotide/1.zig

+14-10
Original file line numberDiff line numberDiff line change
@@ -85,7 +85,13 @@ pub fn readInput() ![]const u8 {
8585
return buf;
8686
}
8787

88-
const Map = std.AutoHashMapUnmanaged(Code, u32);
88+
const CodeContext = struct {
89+
pub fn eql(_: CodeContext, a: Code, b: Code) bool { return a.data == b.data; }
90+
pub fn hash(_: CodeContext, c: Code) u64 { return c.data ^ (c.data >> 7); }
91+
};
92+
93+
const Map = std.HashMapUnmanaged(Code, u32, CodeContext, 45);
94+
8995
const Iter = struct {
9096
i: usize = 0,
9197
input: []const u8,
@@ -102,6 +108,7 @@ const Iter = struct {
102108
.mask = mask,
103109
};
104110
}
111+
105112
pub fn next(self: *Iter) ?Code {
106113
if (self.i >= self.input.len) return null;
107114
defer self.i += 1;
@@ -112,7 +119,7 @@ const Iter = struct {
112119
};
113120

114121
fn genMap(seq: []const u8, n: usize, map: *Map) !void {
115-
map.clearRetainingCapacity();
122+
map.clearAndFree(global_allocator);
116123
var iter = Iter.init(seq, n);
117124
while (iter.next()) |code| {
118125
const gop = try map.getOrPut(global_allocator, code);
@@ -161,11 +168,11 @@ fn printOcc(s: []const u8, map: *Map) !void {
161168

162169
pub fn main() !void {
163170
const occs = [_][]const u8{
164-
"GGTATTTTAATTTATAGT",
165-
"GGTATTTTAATT",
166-
"GGTATT",
167-
"GGTA",
168171
"GGT",
172+
"GGTA",
173+
"GGTATT",
174+
"GGTATTTTAATT",
175+
"GGTATTTTAATTTATAGT",
169176
};
170177
const input = try readInput();
171178
var map: Map = .{};
@@ -174,11 +181,8 @@ pub fn main() !void {
174181
try genMap(input, 2, &map);
175182
try printMap(2, map);
176183

177-
var i = occs.len - 1;
178-
while (true) : (i -= 1) {
179-
const occ = occs[i];
184+
for (occs) |occ| {
180185
try genMap(input, occ.len, &map);
181186
try printOcc(occ, &map);
182-
if (i == 0) break;
183187
}
184188
}

0 commit comments

Comments
 (0)