mirror of
https://github.com/ziglang/zig.git
synced 2025-12-06 06:13:07 +00:00
ArgIteratorWindows.init: Take []const u16 slice instead of multi-item pointer
Now that we use the PEB to get the precise length of the command line string, there's no need for a multi-item pointer/sliceTo call. This provides a minor speedup:
Benchmark 1 (153 runs): benchargv-before.exe
measurement mean ± σ min … max outliers delta
wall_time 32.7ms ± 429us 32.1ms … 36.9ms 1 ( 1%) 0%
peak_rss 6.49MB ± 5.62KB 6.46MB … 6.49MB 14 ( 9%) 0%
Benchmark 2 (157 runs): benchargv-after.exe
measurement mean ± σ min … max outliers delta
wall_time 31.9ms ± 236us 31.4ms … 32.7ms 4 ( 3%) ⚡- 2.4% ± 0.2%
peak_rss 6.49MB ± 4.77KB 6.46MB … 6.49MB 14 ( 9%) + 0.0% ± 0.0%
This commit is contained in:
parent
1a62cfffa7
commit
d48251d0f0
@ -664,7 +664,7 @@ pub const ArgIteratorWasi = struct {
|
||||
pub const ArgIteratorWindows = struct {
|
||||
allocator: Allocator,
|
||||
/// Encoded as WTF-16 LE.
|
||||
cmd_line: [:0]const u16,
|
||||
cmd_line: []const u16,
|
||||
index: usize = 0,
|
||||
/// Owned by the iterator. Long enough to hold contiguous NUL-terminated slices
|
||||
/// of each argument encoded as WTF-8.
|
||||
@ -678,9 +678,8 @@ pub const ArgIteratorWindows = struct {
|
||||
///
|
||||
/// The iterator stores and uses `cmd_line_w`, so its memory must be valid for
|
||||
/// at least as long as the returned ArgIteratorWindows.
|
||||
pub fn init(allocator: Allocator, cmd_line_w: [*:0]const u16) InitError!ArgIteratorWindows {
|
||||
const cmd_line = mem.sliceTo(cmd_line_w, 0);
|
||||
const wtf8_len = unicode.calcWtf8Len(cmd_line);
|
||||
pub fn init(allocator: Allocator, cmd_line_w: []const u16) InitError!ArgIteratorWindows {
|
||||
const wtf8_len = unicode.calcWtf8Len(cmd_line_w);
|
||||
|
||||
// This buffer must be large enough to contain contiguous NUL-terminated slices
|
||||
// of each argument.
|
||||
@ -694,7 +693,7 @@ pub const ArgIteratorWindows = struct {
|
||||
|
||||
return .{
|
||||
.allocator = allocator,
|
||||
.cmd_line = cmd_line,
|
||||
.cmd_line = cmd_line_w,
|
||||
.buffer = buffer,
|
||||
};
|
||||
}
|
||||
@ -1151,8 +1150,8 @@ pub const ArgIterator = struct {
|
||||
}
|
||||
if (native_os == .windows) {
|
||||
const cmd_line = std.os.windows.peb().ProcessParameters.CommandLine;
|
||||
const cmd_line_w = cmd_line.Buffer.?[0 .. cmd_line.Length / 2 :0];
|
||||
return ArgIterator{ .inner = try InnerType.init(allocator, cmd_line_w.ptr) };
|
||||
const cmd_line_w = cmd_line.Buffer.?[0 .. cmd_line.Length / 2];
|
||||
return ArgIterator{ .inner = try InnerType.init(allocator, cmd_line_w) };
|
||||
}
|
||||
|
||||
return ArgIterator{ .inner = InnerType.init() };
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user