Skip to content

implement xargs -P using rayon and a spin lock#653

Open
asakatida wants to merge 1 commit intouutils:mainfrom
asakatida:push-zlxwkxlkpsls
Open

implement xargs -P using rayon and a spin lock#653
asakatida wants to merge 1 commit intouutils:mainfrom
asakatida:push-zlxwkxlkpsls

Conversation

@asakatida
Copy link
Copy Markdown

if this is accepted then I could do #112 in a similar way

Comment thread src/xargs/mod.rs
batches
.par_bridge()
.map(|batch| batch?.execute_parallel(capacity).map_err(XargsError::from))
.collect()
Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

this is meat of the change, the other option here to avoid would be to build the thread pool directly which would avoid needing a lock but I feel the impl Iterator is a cleaner abstraction and is in line with rayon advice

@asakatida asakatida force-pushed the push-zlxwkxlkpsls branch from 61aae5c to e175c3c Compare April 8, 2026 09:40
@asakatida
Copy link
Copy Markdown
Author

if more tests are desired then I have a branch ready to push

@codecov
Copy link
Copy Markdown

codecov bot commented Apr 8, 2026

Codecov Report

❌ Patch coverage is 92.56198% with 9 lines in your changes missing coverage. Please review.
✅ Project coverage is 91.77%. Comparing base (165b2fa) to head (aa1ec44).

Files with missing lines Patch % Lines
src/xargs/mod.rs 92.56% 5 Missing and 4 partials ⚠️
Additional details and impacted files
@@           Coverage Diff           @@
##             main     #653   +/-   ##
=======================================
  Coverage   91.76%   91.77%           
=======================================
  Files          31       31           
  Lines        6203     6283   +80     
  Branches      328      329    +1     
=======================================
+ Hits         5692     5766   +74     
- Misses        390      394    +4     
- Partials      121      123    +2     

☔ View full report in Codecov by Sentry.
📢 Have feedback on the report? Share it here.

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.

@sylvestre
Copy link
Copy Markdown
Contributor

Did you run some benchmark on it?

@asakatida
Copy link
Copy Markdown
Author

here's a few ad-hoc rough numbers

/Users/asakatida/repo/workspace/uutils-findutils
> time echo 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 | target/release/xargs -n2 -P2 sleep

________________________________________________________
Executed in   32.22 secs    fish           external
   usr time  186.48 secs   69.00 micros  186.48 secs
   sys time    0.38 secs  342.00 micros    0.37 secs

/Users/asakatida/repo/workspace/uutils-findutils
> time echo 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 | target/release/xargs -n2 -P8 sleep

________________________________________________________
Executed in    8.02 secs    fish           external
   usr time   24.01 secs   55.00 micros   24.01 secs
   sys time    0.06 secs  303.00 micros    0.06 secs

/Users/asakatida/repo/workspace/uutils-findutils
> time echo 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 | target/release/xargs -n2 -P32 sleep

________________________________________________________
Executed in    8.01 secs      fish           external
   usr time   12.39 millis   65.00 micros   12.32 millis
   sys time   26.17 millis  313.00 micros   25.85 millis

/Users/asakatida/repo/workspace/uutils-findutils
> time echo 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 | target/release/xargs -n8 -P2 sleep

________________________________________________________
Executed in   32.02 secs    fish           external
   usr time   31.97 secs   52.00 micros   31.97 secs
   sys time    0.06 secs  289.00 micros    0.06 secs

/Users/asakatida/repo/workspace/uutils-findutils
> time echo 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 | target/release/xargs -n8 -P8 sleep

________________________________________________________
Executed in   16.01 secs      fish           external
   usr time    4.72 millis  101.00 micros    4.62 millis
   sys time    9.61 millis  427.00 micros    9.18 millis

/Users/asakatida/repo/workspace/uutils-findutils
> time echo 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 | target/release/xargs -n8 -P32 sleep

________________________________________________________
Executed in   16.01 secs      fish           external
   usr time    5.09 millis   68.00 micros    5.03 millis
   sys time    8.87 millis  282.00 micros    8.59 millis

/Users/asakatida/repo/workspace/uutils-findutils
> time echo 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 | target/release/xargs -n32 -P2 sleep

________________________________________________________
Executed in   64.02 secs      fish           external
   usr time    3.42 millis  107.00 micros    3.31 millis
   sys time    7.28 millis  398.00 micros    6.88 millis

/Users/asakatida/repo/workspace/uutils-findutils
> time echo 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 | target/release/xargs -n32 -P8 sleep
 
________________________________________________________
Executed in   64.01 secs      fish           external
   usr time    3.03 millis   61.00 micros    2.97 millis
   sys time    6.12 millis  306.00 micros    5.81 millis

/Users/asakatida/repo/workspace/uutils-findutils
> time echo 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 | target/release/xargs -n32 -P32 sleep

________________________________________________________
Executed in   64.01 secs      fish           external
   usr time    3.17 millis   53.00 micros    3.11 millis
   sys time    5.61 millis  334.00 micros    5.28 millis

/Users/asakatida/repo/workspace/uutils-findutils
> time echo 2 2 2 2 2 2 2 2 | target/release/xargs -n2 -P2 sleep

________________________________________________________
Executed in    8.02 secs    fish           external
   usr time    8.01 secs   54.00 micros    8.01 secs
   sys time    0.02 secs  287.00 micros    0.02 secs

/Users/asakatida/repo/workspace/uutils-findutils
> time echo 2 2 2 2 2 2 2 2 | target/release/xargs -n2 -P8 sleep

________________________________________________________
Executed in    4.04 secs      fish           external
   usr time    7.97 millis   92.00 micros    7.88 millis
   sys time   12.45 millis  474.00 micros   11.98 millis

/Users/asakatida/repo/workspace/uutils-findutils
> time echo 2 2 2 2 2 2 2 2 | target/release/xargs -n2 -P32 sleep

________________________________________________________
Executed in    4.04 secs      fish           external
   usr time    7.93 millis   91.00 micros    7.84 millis
   sys time   12.31 millis  466.00 micros   11.84 millis

/Users/asakatida/repo/workspace/uutils-findutils
> time echo 2 2 2 2 2 2 2 2 | target/release/xargs -n8 -P2 sleep

________________________________________________________
Executed in   16.01 secs      fish           external
   usr time    2.89 millis   53.00 micros    2.84 millis
   sys time    6.38 millis  309.00 micros    6.07 millis

/Users/asakatida/repo/workspace/uutils-findutils
> time echo 2 2 2 2 2 2 2 2 | target/release/xargs -n32 -P2 sleep

________________________________________________________
Executed in   16.01 secs      fish           external
   usr time    3.03 millis   64.00 micros    2.96 millis
   sys time    5.32 millis  314.00 micros    5.00 millis

/Users/asakatida/repo/workspace/uutils-findutils
> time echo 2 2 2 2 2 2 2 2 | target/release/xargs -n8 -P8 sleep

________________________________________________________
Executed in   16.02 secs      fish           external
   usr time    3.03 millis   55.00 micros    2.98 millis
   sys time    7.19 millis  306.00 micros    6.88 millis

/Users/asakatida/repo/workspace/uutils-findutils
> time echo 2 2 2 2 2 2 2 2 | target/release/xargs -n8 -P32 sleep

________________________________________________________
Executed in   16.01 secs      fish           external
   usr time    2.92 millis   56.00 micros    2.86 millis
   sys time    6.46 millis  320.00 micros    6.14 millis

/Users/asakatida/repo/workspace/uutils-findutils
> time echo 2 2 2 2 2 2 2 2 | target/release/xargs -n32 -P8 sleep

________________________________________________________
Executed in   16.01 secs      fish           external
   usr time    2.95 millis   64.00 micros    2.88 millis
   sys time    5.85 millis  320.00 micros    5.53 millis

/Users/asakatida/repo/workspace/uutils-findutils
> time echo 2 2 2 2 2 2 2 2 | target/release/xargs -n32 -P32 sleep

________________________________________________________
Executed in   16.01 secs      fish           external
   usr time    2.98 millis   53.00 micros    2.93 millis
   sys time    5.53 millis  286.00 micros    5.25 millis

/Users/asakatida/repo/workspace/uutils-findutils
> time echo 2 2 | target/release/xargs -n2 -P2 sleep

________________________________________________________
Executed in    4.02 secs      fish           external
   usr time    3.22 millis   51.00 micros    3.17 millis
   sys time    7.91 millis  318.00 micros    7.59 millis

/Users/asakatida/repo/workspace/uutils-findutils
> time echo 2 2 | target/release/xargs -n2 -P8 sleep

________________________________________________________
Executed in    4.01 secs      fish           external
   usr time    3.12 millis   59.00 micros    3.06 millis
   sys time    6.27 millis  335.00 micros    5.93 millis

/Users/asakatida/repo/workspace/uutils-findutils
> time echo 2 2 | target/release/xargs -n2 -P32 sleep

________________________________________________________
Executed in    4.02 secs      fish           external
   usr time    3.21 millis   53.00 micros    3.16 millis
   sys time    6.66 millis  313.00 micros    6.34 millis

/Users/asakatida/repo/workspace/uutils-findutils
> time echo 2 2 | target/release/xargs -n8 -P2 sleep

________________________________________________________
Executed in    4.01 secs      fish           external
   usr time    3.04 millis   62.00 micros    2.98 millis
   sys time    6.49 millis  324.00 micros    6.17 millis

/Users/asakatida/repo/workspace/uutils-findutils
> time echo 2 2 | target/release/xargs -n8 -P8 sleep

________________________________________________________
Executed in    4.01 secs      fish           external
   usr time    3.11 millis   58.00 micros    3.05 millis
   sys time    4.80 millis  296.00 micros    4.51 millis

/Users/asakatida/repo/workspace/uutils-findutils
> time echo 2 2 | target/release/xargs -n8 -P32 sleep

________________________________________________________
Executed in    4.01 secs      fish           external
   usr time    3.08 millis   56.00 micros    3.03 millis
   sys time    6.12 millis  308.00 micros    5.81 millis

/Users/asakatida/repo/workspace/uutils-findutils
> time echo 2 2 | target/release/xargs -n32 -P2 sleep

________________________________________________________
Executed in    4.01 secs      fish           external
   usr time    3.04 millis   49.00 micros    2.99 millis
   sys time    6.34 millis  330.00 micros    6.01 millis

/Users/asakatida/repo/workspace/uutils-findutils
> time echo 2 2 | target/release/xargs -n32 -P8 sleep

________________________________________________________
Executed in    4.01 secs      fish           external
   usr time    3.00 millis   63.00 micros    2.94 millis
   sys time    6.41 millis  319.00 micros    6.09 millis

/Users/asakatida/repo/workspace/uutils-findutils
> time echo 2 2 | target/release/xargs -n32 -P32 sleep

________________________________________________________
Executed in    4.01 secs      fish           external
   usr time    3.25 millis   56.00 micros    3.19 millis
   sys time    6.60 millis  342.00 micros    6.26 millis

@asakatida
Copy link
Copy Markdown
Author

a few more that probably have more cpu contention

/Users/asakatida/repo/workspace/uutils-findutils
> time target/release/find ../jj-vcs-jj/ -name Cargo.toml -print0 | target/release/xargs -0 -n1 -P3 cargo build --manifest-path 2>/dev/null

________________________________________________________
Executed in    1.28 secs    fish           external
   usr time    1.85 secs    0.23 millis    1.85 secs
   sys time    0.69 secs    1.12 millis    0.69 secs

/Users/asakatida/repo/workspace/uutils-findutils
> time find ../jj-vcs-jj/ -name Cargo.toml -print0 | xargs -0 -n1 -P3 cargo build --manifest-path 2>/dev/null

________________________________________________________
Executed in    2.71 secs      fish           external
   usr time  952.11 millis   12.30 millis  939.81 millis
   sys time  757.92 millis    4.01 millis  753.91 millis

/Users/asakatida/repo/workspace/uutils-findutils
> time target/release/find ../jj-vcs-jj/ -name Cargo.toml -print0 | xargs -0 -n1 -P3 cargo build --manifest-path 2>/dev/null

________________________________________________________
Executed in    1.20 secs      fish           external
   usr time  744.81 millis    0.18 millis  744.63 millis
   sys time  469.26 millis    1.31 millis  467.95 millis

/Users/asakatida/repo/workspace/uutils-findutils
> time find ../jj-vcs-jj/ -name Cargo.toml -print0 | target/release/xargs -0 -n1 -P3 cargo build --manifest-path 2>/dev/null

________________________________________________________
Executed in  856.59 millis    fish           external
   usr time    1.56 secs      0.23 millis    1.56 secs
   sys time    0.48 secs      1.36 millis    0.48 secs

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants