diff --git a/lib/std/io.zig b/lib/std/io.zig index 8f80fac946c0..238f7eb0f06b 100644 --- a/lib/std/io.zig +++ b/lib/std/io.zig @@ -107,6 +107,13 @@ pub fn BufferedInStreamCustom(comptime buffer_size: usize, comptime Error: type) fn readFn(in_stream: *Stream, dest: []u8) !usize { const self = @fieldParentPtr(Self, "stream", in_stream); + // Hot path for one byte reads + if (dest.len == 1 and self.end_index > self.start_index) { + dest[0] = self.buffer[self.start_index]; + self.start_index += 1; + return 1; + } + var dest_index: usize = 0; while (true) { const dest_space = dest.len - dest_index; @@ -126,6 +133,13 @@ pub fn BufferedInStreamCustom(comptime buffer_size: usize, comptime Error: type) if (dest_space < buffer_size) { self.start_index = 0; self.end_index = try self.unbuffered_in_stream.read(self.buffer[0..]); + + // Shortcut + if (self.end_index >= dest_space) { + mem.copy(u8, dest[dest_index..], self.buffer[0..dest_space]); + self.start_index = dest_space; + return dest.len; + } } else { // asking for so much data that buffering is actually less efficient. // forward the request directly to the unbuffered stream diff --git a/lib/std/io/in_stream.zig b/lib/std/io/in_stream.zig index c51d9eb18782..ab02d20eed61 100644 --- a/lib/std/io/in_stream.zig +++ b/lib/std/io/in_stream.zig @@ -174,7 +174,8 @@ pub fn InStream(comptime ReadError: type) type { /// Reads 1 byte from the stream or returns `error.EndOfStream`. pub fn readByte(self: *Self) !u8 { var result: [1]u8 = undefined; - try self.readNoEof(result[0..]); + const amt_read = try self.read(result[0..]); + if (amt_read < 1) return error.EndOfStream; return result[0]; }