zig

fork of https://codeberg.org/ziglang/zig
Log | Files | Refs | README | LICENSE

commit d48251d0f0d2de2f618afe65db3ba425b332d5c4 (tree)
parent 1a62cfffa79917d930b77f2598b1bfc93efeede5
Author: Ryan Liptak <squeek502@hotmail.com>
Date:   Sat, 13 Jul 2024 17:29:18 -0700

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%

Diffstat:
Mlib/std/process.zig | 13++++++-------
1 file changed, 6 insertions(+), 7 deletions(-)

diff --git a/lib/std/process.zig b/lib/std/process.zig @@ -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() };