Skip to content

Commit 23b2015

Browse files
authored
bug fixes (#21)
2 parents 4d9ca08 + efded65 commit 23b2015

File tree

1 file changed

+116
-0
lines changed

1 file changed

+116
-0
lines changed

examples/optimized_benchmark.zig

Lines changed: 116 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,116 @@
1+
const std = @import("std");
2+
const hash_zig = @import("hash-zig");
3+
const optimized_signature = @import("optimized_signature");
4+
const params = hash_zig.params;
5+
6+
pub fn main() !void {
7+
var gpa = std.heap.GeneralPurposeAllocator(.{}){};
8+
defer _ = gpa.deinit();
9+
const allocator = gpa.allocator();
10+
11+
std.debug.print("Optimized Hash-Zig Performance Benchmark\n", .{});
12+
std.debug.print("========================================\n", .{});
13+
std.debug.print("Comparing original vs optimized implementations\n\n", .{});
14+
15+
// Test parameters
16+
const lifetimes = [_]params.KeyLifetime{ .lifetime_2_10, .lifetime_2_16 };
17+
const test_message = "Performance test message for hash-based signatures";
18+
19+
for (lifetimes) |lifetime| {
20+
const num_sigs = @as(usize, 1) << @intCast(@intFromEnum(lifetime));
21+
std.debug.print("Testing lifetime: {} ({} signatures)\n", .{ lifetime, num_sigs });
22+
std.debug.print("------------------------------------------------\n", .{});
23+
24+
// Test original implementation
25+
std.debug.print("Original implementation:\n", .{});
26+
const original_time = try benchmarkOriginal(allocator, lifetime, test_message);
27+
std.debug.print(" Key generation: {d:.3}s\n", .{original_time});
28+
29+
// Test optimized implementation
30+
std.debug.print("Optimized implementation:\n", .{});
31+
const optimized_time = try benchmarkOptimized(allocator, lifetime, test_message);
32+
std.debug.print(" Key generation: {d:.3}s\n", .{optimized_time});
33+
34+
const speedup = original_time / optimized_time;
35+
std.debug.print(" Speedup: {d:.2}x\n", .{speedup});
36+
std.debug.print("\n", .{});
37+
}
38+
}
39+
40+
fn benchmarkOriginal(allocator: std.mem.Allocator, lifetime: params.KeyLifetime, message: []const u8) !f64 {
41+
const params_orig = hash_zig.Parameters.init(lifetime);
42+
var sig_scheme = try hash_zig.HashSignature.init(allocator, params_orig);
43+
defer sig_scheme.deinit();
44+
45+
const seed: [32]u8 = .{42} ** 32;
46+
47+
const start_time = std.time.nanoTimestamp();
48+
var keypair = try sig_scheme.generateKeyPair(allocator, &seed);
49+
defer keypair.deinit(allocator);
50+
const end_time = std.time.nanoTimestamp();
51+
52+
const duration_ns = end_time - start_time;
53+
const duration_sec = @as(f64, @floatFromInt(duration_ns)) / 1_000_000_000.0;
54+
55+
// Test signing performance
56+
const sign_start = std.time.nanoTimestamp();
57+
var signature = try sig_scheme.sign(allocator, message, keypair.secret_key, 0);
58+
defer signature.deinit(allocator);
59+
const sign_end = std.time.nanoTimestamp();
60+
61+
const sign_duration_ns = sign_end - sign_start;
62+
const sign_duration_sec = @as(f64, @floatFromInt(sign_duration_ns)) / 1_000_000_000.0;
63+
64+
// Test verification performance
65+
const verify_start = std.time.nanoTimestamp();
66+
const is_valid = try sig_scheme.verify(allocator, message, signature, keypair.public_key);
67+
const verify_end = std.time.nanoTimestamp();
68+
69+
const verify_duration_ns = verify_end - verify_start;
70+
const verify_duration_sec = @as(f64, @floatFromInt(verify_duration_ns)) / 1_000_000_000.0;
71+
72+
std.debug.print(" Sign: {d:.3}ms\n", .{sign_duration_sec * 1000});
73+
std.debug.print(" Verify: {d:.3}ms\n", .{verify_duration_sec * 1000});
74+
std.debug.print(" Valid: {}\n", .{is_valid});
75+
76+
return duration_sec;
77+
}
78+
79+
fn benchmarkOptimized(allocator: std.mem.Allocator, lifetime: params.KeyLifetime, message: []const u8) !f64 {
80+
const params_opt = hash_zig.Parameters.init(lifetime);
81+
var sig_scheme = try optimized_signature.OptimizedHashSignature.init(allocator, params_opt);
82+
defer sig_scheme.deinit();
83+
84+
const seed: [32]u8 = .{42} ** 32;
85+
86+
const start_time = std.time.nanoTimestamp();
87+
var keypair = try sig_scheme.generateKeyPair(&seed);
88+
defer keypair.deinit(&sig_scheme.arena);
89+
const end_time = std.time.nanoTimestamp();
90+
91+
const duration_ns = end_time - start_time;
92+
const duration_sec = @as(f64, @floatFromInt(duration_ns)) / 1_000_000_000.0;
93+
94+
// Test signing performance
95+
const sign_start = std.time.nanoTimestamp();
96+
var signature = try sig_scheme.sign(message, keypair.secret_key, 0);
97+
defer signature.deinit(&sig_scheme.arena);
98+
const sign_end = std.time.nanoTimestamp();
99+
100+
const sign_duration_ns = sign_end - sign_start;
101+
const sign_duration_sec = @as(f64, @floatFromInt(sign_duration_ns)) / 1_000_000_000.0;
102+
103+
// Test verification performance
104+
const verify_start = std.time.nanoTimestamp();
105+
const is_valid = try sig_scheme.verify(message, signature, keypair.public_key);
106+
const verify_end = std.time.nanoTimestamp();
107+
108+
const verify_duration_ns = verify_end - verify_start;
109+
const verify_duration_sec = @as(f64, @floatFromInt(verify_duration_ns)) / 1_000_000_000.0;
110+
111+
std.debug.print(" Sign: {d:.3}ms\n", .{sign_duration_sec * 1000});
112+
std.debug.print(" Verify: {d:.3}ms\n", .{verify_duration_sec * 1000});
113+
std.debug.print(" Valid: {}\n", .{is_valid});
114+
115+
return duration_sec;
116+
}

0 commit comments

Comments
 (0)