From 3bfe4cd25ca7a5ae4d4084818b86ada9236b3bb5 Mon Sep 17 00:00:00 2001 From: Qwerasd Date: Mon, 23 Dec 2024 22:04:37 -0500 Subject: [PATCH] perf(styles): greatly improve style.hash performance By switching to one-shot hashing of the raw bytes of the struct with XxHash3 instead of using `autoHash` with Wyhash, a performance gain of around 20% can be observed in DOOM-fire-zig. --- src/terminal/style.zig | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/src/terminal/style.zig b/src/terminal/style.zig index 0340047e9..fe2589a46 100644 --- a/src/terminal/style.zig +++ b/src/terminal/style.zig @@ -8,8 +8,7 @@ const Offset = size.Offset; const OffsetBuf = size.OffsetBuf; const RefCountedSet = @import("ref_counted_set.zig").RefCountedSet; -const Wyhash = std.hash.Wyhash; -const autoHash = std.hash.autoHash; +const XxHash3 = std.hash.XxHash3; /// The unique identifier for a style. This is at most the number of cells /// that can fit into a terminal page. @@ -230,10 +229,13 @@ pub const Style = struct { _ = try writer.write(" }"); } + /// Hash the raw bytes of the struct with XxHash3 + /// + /// NOTE: Because the struct does not have a guaranteed in-memory layout + /// this hash is NOT suitable for serialization. If used for a hash + /// table that is then serialized, it MUST be re-hashed when read. pub fn hash(self: *const Style) u64 { - var hasher = Wyhash.init(0); - autoHash(&hasher, self.*); - return hasher.final(); + return XxHash3.hash(0, @as(*const [@sizeOf(Style)]u8, @ptrCast(self))); } test {