gentle-flower-25372
02/19/2025, 11:17 PMpants \
--changed-since=origin/main \
--changed-dependents=transitive \
--filter-target-type=docker_image
list
Then I dynamically generate one CI job per docker_image target to run `pants package`/`pants publish` against, etc.
The issue is that the pants list command takes about 2 minutes in our monorepo. I was hoping to figure out some trick to reduce the time it takes to generate a list of changed docker_image targets.
Does anyone have any creative workarounds? I am already using a remote cache (bazel-remote-cache) but it doesn't seem to help.
pants version: 2.24.1broad-processor-92400
02/20/2025, 3:51 AMpants list taking such a long time is quite surprising to me, as it does very little work (certainly not much interesting in terms of dependency inference or running external processes)
To make the debugging faster, can you reproduce the slowness locally?gorgeous-winter-99296
02/20/2025, 11:56 AMgentle-flower-25372
02/20/2025, 2:14 PMgentle-flower-25372
02/20/2025, 2:15 PMgorgeous-winter-99296
02/20/2025, 2:30 PM$ hyperfine \
--setup 'pkill pantsd' \
--warmup 1 \
'pants list --changed-since=origin/main' \
'pants list --changed-since=origin/main --changed-dependents=transitive' \
'pants list --changed-since=origin/main --filter-target-type=docker_image' \
'pants list --changed-since=origin/main --changed-dependents=transitive --filter-target-type=docker_image'
For me, it gives the following results:
Benchmark 1: pants list --changed-since=origin/main
Time (mean ± σ): 744.8 ms ± 54.2 ms [User: 1.3 ms, System: 17.8 ms]
Range (min … max): 691.3 ms … 857.7 ms 10 runs
Benchmark 2: pants list --changed-since=origin/main --changed-dependents=transitive
Time (mean ± σ): 868.6 ms ± 58.8 ms [User: 6.0 ms, System: 27.5 ms]
Range (min … max): 813.0 ms … 1027.1 ms 10 runs
Benchmark 3: pants list --changed-since=origin/main --filter-target-type=docker_image
Time (mean ± σ): 708.3 ms ± 38.3 ms [User: 5.5 ms, System: 12.6 ms]
Range (min … max): 667.1 ms … 787.6 ms 10 runs
Benchmark 4: pants list --changed-since=origin/main --changed-dependents=transitive --filter-target-type=docker_image
Time (mean ± σ): 863.3 ms ± 59.1 ms [User: 4.1 ms, System: 12.2 ms]
Range (min … max): 811.9 ms … 1022.5 ms 10 runs
Summary
pants list --changed-since=origin/main --filter-target-type=docker_image ran
1.05 ± 0.10 times faster than pants list --changed-since=origin/main
1.22 ± 0.11 times faster than pants list --changed-since=origin/main --changed-dependents=transitive --filter-target-type=docker_image
1.23 ± 0.11 times faster than pants list --changed-since=origin/main --changed-dependents=transitivegorgeous-winter-99296
02/20/2025, 2:31 PMgentle-flower-25372
02/20/2025, 6:34 PMgentle-flower-25372
02/20/2025, 6:34 PMgentle-flower-25372
02/20/2025, 6:38 PMgentle-flower-25372
02/20/2025, 6:39 PMgentle-flower-25372
02/20/2025, 6:43 PMgentle-flower-25372
02/20/2025, 6:47 PMBenchmark 1: pants list --changed-since=origin/main
Time (mean ± σ): 14.270 s ± 1.401 s [User: 0.018 s, System: 0.024 s]
Range (min … max): 13.237 s … 17.769 s 10 runs
Benchmark 2: pants list --changed-since=origin/main --changed-dependents=transitive
Time (mean ± σ): 55.710 s ± 2.416 s [User: 0.622 s, System: 0.094 s]
Range (min … max): 51.785 s … 59.991 s 10 runs
Benchmark 3: pants list --changed-since=origin/main --filter-target-type=docker_image
Time (mean ± σ): 11.551 s ± 1.017 s [User: 0.019 s, System: 0.022 s]
Range (min … max): 10.510 s … 13.449 s 10 runs
Benchmark 4: pants list --changed-since=origin/main --changed-dependents=transitive --filter-target-type=docker_image
Time (mean ± σ): 56.476 s ± 3.808 s [User: 0.640 s, System: 0.101 s]
Range (min … max): 50.772 s … 64.038 s 10 runs
Summary
pants list --changed-since=origin/main --filter-target-type=docker_image ran
1.24 ± 0.16 times faster than pants list --changed-since=origin/main
4.82 ± 0.47 times faster than pants list --changed-since=origin/main --changed-dependents=transitive
4.89 ± 0.54 times faster than pants list --changed-since=origin/main --changed-dependents=transitive --filter-target-type=docker_imagegentle-flower-25372
02/20/2025, 6:50 PM--changed-dependents=transitivegentle-flower-25372
02/20/2025, 7:00 PM$ pants list //:: | wc -l
27443
$ pants list --filter-target-type=docker_image //:: | wc -l
100
$ pants list --filter-target-type=python_requirement //:: | wc -l
1448
$ pants list --filter-target-type=python_source //:: | wc -l
8974
$ pants list --filter-target-type=python_test //:: | wc -l
2106gentle-flower-25372
02/20/2025, 7:12 PMgentle-flower-25372
02/20/2025, 7:16 PMgentle-flower-25372
02/20/2025, 7:17 PMgentle-flower-25372
02/20/2025, 7:17 PMgentle-flower-25372
02/20/2025, 7:17 PMgentle-flower-25372
02/20/2025, 7:17 PMgentle-flower-25372
02/20/2025, 7:18 PMgentle-flower-25372
02/20/2025, 7:19 PMgentle-flower-25372
02/20/2025, 7:20 PMgentle-flower-25372
02/20/2025, 7:20 PMgentle-flower-25372
02/20/2025, 7:22 PMgorgeous-winter-99296
02/20/2025, 7:23 PMgorgeous-winter-99296
02/20/2025, 7:23 PMgentle-flower-25372
02/20/2025, 7:23 PMgorgeous-winter-99296
02/20/2025, 7:24 PMgentle-flower-25372
02/20/2025, 7:24 PMgentle-flower-25372
02/20/2025, 7:25 PMgorgeous-winter-99296
02/20/2025, 7:28 PMgorgeous-winter-99296
02/20/2025, 7:29 PMgentle-flower-25372
02/20/2025, 7:29 PMgentle-flower-25372
02/20/2025, 7:30 PMgorgeous-winter-99296
02/20/2025, 7:32 PMchanged backend, as far as I can tell. Dependencies, on the other hand, is queried everywhere. So the question is just how the scaling works out.gentle-flower-25372
02/20/2025, 7:45 PMgorgeous-winter-99296
02/20/2025, 7:46 PM--filter-address-regex in theorygentle-flower-25372
02/20/2025, 7:55 PMgentle-flower-25372
02/20/2025, 7:56 PMgentle-flower-25372
02/20/2025, 7:57 PMgentle-flower-25372
02/20/2025, 7:58 PMgorgeous-winter-99296
02/20/2025, 8:00 PMgorgeous-winter-99296
02/23/2025, 3:18 PMgorgeous-winter-99296
02/23/2025, 3:38 PMcurved-manchester-66006
02/28/2025, 7:47 PMDoes anyone have any creative workarounds?To clarify since you mentioned you can reproduce locally, does having
pantsd effect performance? If you do pants list :: and then the changed calculation, is there any change in performance?
Wild Speculation: Does the new rust Dockerfile parser help at all?gentle-flower-25372
03/01/2025, 7:36 PM$ hyperfine \
--warmup 1 --runs 2 --setup 'pkill pantsd ||:' \
--prepare 'pants list //::' 'pants list --changed-since=HEAD~250' \
--prepare 'pants list //::' 'pants list --changed-since=HEAD~250 --changed-dependents=transitive' \
--prepare 'pants list //::' 'pants list --changed-since=HEAD~250 --filter-target-type=docker_image' \
--prepare 'pants list //::' 'pants list --changed-since=HEAD~250 --changed-dependents=transitive --filter-target-type=docker_image'
Benchmark 1: pants list --changed-since=HEAD~250
Time (mean ± σ): 11.909 s ± 0.229 s [User: 0.035 s, System: 0.081 s]
Range (min … max): 11.747 s … 12.071 s 2 runs
Benchmark 2: pants list --changed-since=HEAD~250 --changed-dependents=transitive
Time (mean ± σ): 51.341 s ± 0.212 s [User: 0.098 s, System: 0.276 s]
Range (min … max): 51.191 s … 51.491 s 2 runs
Benchmark 3: pants list --changed-since=HEAD~250 --filter-target-type=docker_image
Time (mean ± σ): 11.730 s ± 0.003 s [User: 0.020 s, System: 0.025 s]
Range (min … max): 11.729 s … 11.732 s 2 runs
Benchmark 4: pants list --changed-since=HEAD~250 --changed-dependents=transitive --filter-target-type=docker_image
Time (mean ± σ): 50.657 s ± 0.183 s [User: 0.018 s, System: 0.024 s]
Range (min … max): 50.527 s … 50.787 s 2 runs
Summary
pants list --changed-since=HEAD~250 --filter-target-type=docker_image ran
1.02 ± 0.02 times faster than pants list --changed-since=HEAD~250
4.32 ± 0.02 times faster than pants list --changed-since=HEAD~250 --changed-dependents=transitive --filter-target-type=docker_image
4.38 ± 0.02 times faster than pants list --changed-since=HEAD~250 --changed-dependents=transitivegentle-flower-25372
03/01/2025, 7:36 PMgentle-flower-25372
03/01/2025, 7:37 PM