Skip to content

Commit

Permalink
std.fs.File: use file size as ArrayList initial capacity
Browse files Browse the repository at this point in the history
  • Loading branch information
nm-remarkable committed Oct 1, 2024
1 parent 3b465eb commit 5518191
Show file tree
Hide file tree
Showing 2 changed files with 18 additions and 7 deletions.
2 changes: 1 addition & 1 deletion lib/compiler/fmt.zig
Original file line number Diff line number Diff line change
Expand Up @@ -276,7 +276,7 @@ fn fmtPathFile(
const source_code = try std.zig.readSourceFileToEndAlloc(
gpa,
source_file,
std.math.cast(usize, stat.size) orelse return error.FileTooBig,
null,
);
defer gpa.free(source_code);

Expand Down
23 changes: 17 additions & 6 deletions lib/std/fs/File.zig
Original file line number Diff line number Diff line change
Expand Up @@ -1149,13 +1149,24 @@ pub fn readToEndAllocOptions(
comptime alignment: u29,
comptime optional_sentinel: ?u8,
) !(if (optional_sentinel) |s| [:s]align(alignment) u8 else []align(alignment) u8) {
// If no size hint is provided fall back to the size=0 code path
const size = size_hint orelse 0;

// The file size returned by stat is used as hint to set the buffer
// size. If the reported size is zero, as it happens on Linux for files
// in /proc, a small buffer is allocated instead.
const initial_cap = (if (size > 0) size else 1024) + @intFromBool(optional_sentinel != null);
var size: usize = undefined;
if (size_hint) |hint| {
size = hint;
} else {
// If no size hint is provided the file size returned by stat() is used as a
// hint to set the buffer size.
const file_stat = self.stat();
if (file_stat) |value| {
size = std.math.cast(usize, value.size) orelse return error.FileTooBig;
} else |_| {
// If the reported size is zero or there was an error reading stat(),
// for example on Linux for files in /proc, a small buffer is allocated instead.
size = 1024;
}
}

const initial_cap = size + @intFromBool(optional_sentinel != null);
var array_list = try std.ArrayListAligned(u8, alignment).initCapacity(allocator, initial_cap);
defer array_list.deinit();

Expand Down

0 comments on commit 5518191

Please sign in to comment.