summaryrefslogtreecommitdiff
path: root/tests_tty_perf.zig
diff options
context:
space:
mode:
Diffstat (limited to 'tests_tty_perf.zig')
-rw-r--r--tests_tty_perf.zig88
1 files changed, 88 insertions, 0 deletions
diff --git a/tests_tty_perf.zig b/tests_tty_perf.zig
new file mode 100644
index 00000000..06ce9cc3
--- /dev/null
+++ b/tests_tty_perf.zig
@@ -0,0 +1,88 @@
+const std = @import("std");
+const h = @import("e2e_harness.zig");
+
+const Harness = h.Harness;
+const linux = std.os.linux;
+
+const samples = 5;
+const payload_len = 64;
+
+fn nowNs() u64 {
+ var ts: linux.timespec = undefined;
+ _ = linux.clock_gettime(linux.CLOCK.MONOTONIC, &ts);
+ return @intCast(ts.sec * 1_000_000_000 + ts.nsec);
+}
+
+fn fillPayload(buf: *[payload_len]u8, sample: usize) []const u8 {
+ const alphabet = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
+ for (buf, 0..) |*ch, i| ch.* = alphabet[(i + sample * 13) % alphabet.len];
+
+ var marker_buf: [16]u8 = undefined;
+ const marker = std.fmt.bufPrint(&marker_buf, "ZTPERF{d}END", .{sample}) catch unreachable;
+ const start = payload_len - marker.len;
+ @memcpy(buf[start..][0..marker.len], marker);
+ return buf[start..payload_len];
+}
+
+fn clickBodyRow(hs: *Harness, screen_row: usize) !void {
+ var seq_buf: [64]u8 = undefined;
+ const seq = try std.fmt.bufPrint(&seq_buf, "\x1b[<0;3;{d}M\x1b[<0;3;{d}m", .{ screen_row, screen_row });
+ try hs.send(seq);
+}
+
+pub fn main(init: std.process.Init) !void {
+ const gpa = init.gpa;
+ const args = try init.minimal.args.toSlice(init.arena.allocator());
+ if (args.len != 2) {
+ std.debug.print("usage: {s} <pardes-exe>\n", .{args[0]});
+ return error.BadArgs;
+ }
+
+ var hs = try Harness.initArgs(gpa, args[1].ptr, 24, 80, "--tty");
+ defer hs.deinit();
+
+ try hs.expectWaitFor("sy /", 6000, "--tty did not start in tty mode");
+ try hs.send("clear\r");
+ try hs.pump(900);
+ try hs.send("\x02");
+ try hs.expectWaitFor("nm /", 6000, "Ctrl-b did not leave tty mode");
+
+ var best_us: u64 = std.math.maxInt(u64);
+ var total_us: u64 = 0;
+
+ std.debug.print("tty-edit-perf backend=vaxis samples={d} chars_per_sample={d}\n", .{ samples, payload_len });
+
+ var sample: usize = 0;
+ while (sample < samples) : (sample += 1) {
+ const row = 5 + sample * 3;
+ try clickBodyRow(&hs, row);
+ try hs.pump(80);
+ try hs.send("i");
+ try hs.expectWaitFor("in /", 3000, "failed to enter insert mode");
+
+ var payload_buf: [payload_len]u8 = undefined;
+ const marker = fillPayload(&payload_buf, sample);
+
+ const t0 = nowNs();
+ try hs.send(&payload_buf);
+ try hs.expectWaitFor(marker, 10_000, "typed marker never appeared");
+ const elapsed_us = (nowNs() - t0) / 1000;
+
+ best_us = @min(best_us, elapsed_us);
+ total_us += elapsed_us;
+ std.debug.print(" sample {d}: elapsed_us={d} us_per_char={d}\n", .{
+ sample + 1,
+ elapsed_us,
+ elapsed_us / payload_len,
+ });
+
+ try hs.send("\x1b");
+ try hs.expectWaitFor("nm /", 3000, "failed to leave insert mode");
+ }
+
+ std.debug.print("tty-edit-perf summary: best_us={d} avg_us={d} best_us_per_char={d}\n", .{
+ best_us,
+ total_us / samples,
+ best_us / payload_len,
+ });
+}