mirror of
https://github.com/ziglang/zig.git
synced 2026-02-21 08:45:52 +00:00
Add a benchmark for signature verifications
This commit is contained in:
parent
2d9befe9bf
commit
047599928a
@ -134,8 +134,8 @@ pub fn benchmarkSignature(comptime Signature: anytype, comptime signatures_count
|
||||
{
|
||||
var i: usize = 0;
|
||||
while (i < signatures_count) : (i += 1) {
|
||||
const s = try Signature.sign(&msg, key_pair, null);
|
||||
mem.doNotOptimizeAway(&s);
|
||||
const sig = try Signature.sign(&msg, key_pair, null);
|
||||
mem.doNotOptimizeAway(&sig);
|
||||
}
|
||||
}
|
||||
const end = timer.read();
|
||||
@ -146,6 +146,65 @@ pub fn benchmarkSignature(comptime Signature: anytype, comptime signatures_count
|
||||
return throughput;
|
||||
}
|
||||
|
||||
const signature_verifications = [_]Crypto{Crypto{ .ty = crypto.sign.Ed25519, .name = "ed25519" }};
|
||||
|
||||
pub fn benchmarkSignatureVerification(comptime Signature: anytype, comptime signatures_count: comptime_int) !u64 {
|
||||
var seed: [Signature.seed_length]u8 = undefined;
|
||||
prng.random.bytes(seed[0..]);
|
||||
const msg = [_]u8{0} ** 64;
|
||||
const key_pair = try Signature.createKeyPair(seed);
|
||||
const public_key = Signature.publicKey(key_pair);
|
||||
const sig = try Signature.sign(&msg, key_pair, null);
|
||||
|
||||
var timer = try Timer.start();
|
||||
const start = timer.lap();
|
||||
{
|
||||
var i: usize = 0;
|
||||
while (i < signatures_count) : (i += 1) {
|
||||
try Signature.verify(sig, &msg, public_key);
|
||||
mem.doNotOptimizeAway(&sig);
|
||||
}
|
||||
}
|
||||
const end = timer.read();
|
||||
|
||||
const elapsed_s = @intToFloat(f64, end - start) / time.ns_per_s;
|
||||
const throughput = @floatToInt(u64, signatures_count / elapsed_s);
|
||||
|
||||
return throughput;
|
||||
}
|
||||
|
||||
const batch_signature_verifications = [_]Crypto{Crypto{ .ty = crypto.sign.Ed25519, .name = "ed25519" }};
|
||||
|
||||
pub fn benchmarkBatchSignatureVerification(comptime Signature: anytype, comptime signatures_count: comptime_int) !u64 {
|
||||
var seed: [Signature.seed_length]u8 = undefined;
|
||||
prng.random.bytes(seed[0..]);
|
||||
const msg = [_]u8{0} ** 64;
|
||||
const key_pair = try Signature.createKeyPair(seed);
|
||||
const public_key = Signature.publicKey(key_pair);
|
||||
const sig = try Signature.sign(&msg, key_pair, null);
|
||||
|
||||
var batch: [64]Signature.BatchElement = undefined;
|
||||
for (batch) |*element| {
|
||||
element.* = Signature.BatchElement{ .sig = sig, .msg = &msg, .public_key = public_key };
|
||||
}
|
||||
|
||||
var timer = try Timer.start();
|
||||
const start = timer.lap();
|
||||
{
|
||||
var i: usize = 0;
|
||||
while (i < signatures_count) : (i += 1) {
|
||||
try Signature.verifyBatch(batch.len, batch);
|
||||
mem.doNotOptimizeAway(&sig);
|
||||
}
|
||||
}
|
||||
const end = timer.read();
|
||||
|
||||
const elapsed_s = @intToFloat(f64, end - start) / time.ns_per_s;
|
||||
const throughput = batch.len * @floatToInt(u64, signatures_count / elapsed_s);
|
||||
|
||||
return throughput;
|
||||
}
|
||||
|
||||
const aeads = [_]Crypto{
|
||||
Crypto{ .ty = crypto.aead.ChaCha20Poly1305, .name = "chacha20Poly1305" },
|
||||
Crypto{ .ty = crypto.aead.XChaCha20Poly1305, .name = "xchacha20Poly1305" },
|
||||
@ -326,6 +385,20 @@ pub fn main() !void {
|
||||
}
|
||||
}
|
||||
|
||||
inline for (signature_verifications) |E| {
|
||||
if (filter == null or std.mem.indexOf(u8, E.name, filter.?) != null) {
|
||||
const throughput = try benchmarkSignatureVerification(E.ty, mode(1000));
|
||||
try stdout.print("{:>17}: {:10} verifications/s\n", .{ E.name, throughput });
|
||||
}
|
||||
}
|
||||
|
||||
inline for (batch_signature_verifications) |E| {
|
||||
if (filter == null or std.mem.indexOf(u8, E.name, filter.?) != null) {
|
||||
const throughput = try benchmarkBatchSignatureVerification(E.ty, mode(1000));
|
||||
try stdout.print("{:>17}: {:10} verifications/s (batch)\n", .{ E.name, throughput });
|
||||
}
|
||||
}
|
||||
|
||||
inline for (aeads) |E| {
|
||||
if (filter == null or std.mem.indexOf(u8, E.name, filter.?) != null) {
|
||||
const throughput = try benchmarkAead(E.ty, mode(128 * MiB));
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user