summaryrefslogtreecommitdiff
path: root/test/differential/probe.zig
diff options
context:
space:
mode:
Diffstat (limited to 'test/differential/probe.zig')
-rw-r--r--test/differential/probe.zig59
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 });
+}