diff options
Diffstat (limited to 'test/differential/probe.zig')
| -rw-r--r-- | test/differential/probe.zig | 59 |
1 files changed, 59 insertions, 0 deletions
diff --git a/test/differential/probe.zig b/test/differential/probe.zig new file mode 100644 index 0000000..ec7c88e --- /dev/null +++ b/test/differential/probe.zig @@ -0,0 +1,59 @@ +const std = @import("std"); +const c9 = @import("cloud9"); +const libc = std.c; +var reads: u64 = 0; +var writes: u64 = 0; +var bytes_in: u64 = 0; +var bytes_out: u64 = 0; + +fn readAll(bytes: []u8, chunk: usize) !void { + var offset: usize = 0; + while (offset < bytes.len) { + reads += 1; + const n = libc.read(0, bytes[offset..].ptr, @min(chunk, bytes.len - offset)); + if (n <= 0) return error.Input; + offset += @intCast(n); + bytes_in += @intCast(n); + } +} +fn writeAll(bytes: []const u8, chunk: usize) !void { + var offset: usize = 0; + while (offset < bytes.len) { + writes += 1; + const n = libc.write(1, bytes[offset..].ptr, @min(chunk, bytes.len - offset)); + if (n <= 0) return error.Output; + offset += @intCast(n); + bytes_out += @intCast(n); + } +} +fn nowNs() u64 { + var ts: libc.timespec = undefined; + std.debug.assert(libc.clock_gettime(.MONOTONIC, &ts) == 0); + return @as(u64, @intCast(ts.sec)) * std.time.ns_per_s + @as(u64, @intCast(ts.nsec)); +} +pub fn main() !void { + var header: [12]u8 = undefined; + try readAll(&header, header.len); + const count = std.mem.readInt(u32, header[0..4], .little); + const repeats = std.mem.readInt(u32, header[4..8], .little); + const chunk = std.mem.readInt(u32, header[8..12], .little); + if (count > 1_000_000 or repeats == 0 or repeats > 10000 or chunk == 0) return error.Options; + var input: [65536]u8 = undefined; + var output: [65536]u8 = undefined; + var elapsed_ns: u64 = 0; + for (0..count) |_| { + try readAll(input[0..4], chunk); + const len = c9.frameLen(input[0..4]).?; + if (len < c9.header_len or len > input.len) return error.Frame; + try readAll(input[4..len], chunk); + const start = nowNs(); + for (0..repeats) |_| { + const decoded = try c9.decode(input[0..len]); + const encoded = try c9.encode(decoded.msg, decoded.tag, &output); + std.mem.doNotOptimizeAway(encoded); + } + elapsed_ns += nowNs() - start; + try writeAll(output[0..len], chunk); + } + std.debug.print("{{\"implementation\":\"cloud9\",\"codec_ns\":{d},\"operations\":{d},\"read_calls\":{d},\"write_calls\":{d},\"bytes_in\":{d},\"bytes_out\":{d},\"codec_allocations\":0,\"allocation_evidence\":\"no allocator or allocation calls in codec\"}}\n", .{ elapsed_ns, @as(u64, count) * repeats, reads, writes, bytes_in - header.len, bytes_out }); +} |
