summaryrefslogtreecommitdiffstats
path: root/command.py
diff options
context:
space:
mode:
authorKuang-che Wu <kcwu@google.com>2024-10-22 21:04:41 +0800
committerLUCI <gerrit-scoped@luci-project-accounts.iam.gserviceaccount.com>2024-10-23 23:34:34 +0000
commit8da4861b3860c505e39341b4135c21f67569e4d8 (patch)
tree6f300266c91322df0e61953b84381e1f403074a5 /command.py
parent39ffd9977e2f6cb1ca1757e59173fc93e0eab72c (diff)
downloadgit-repo-8da4861b3860c505e39341b4135c21f67569e4d8.tar.gz
subcmds: reduce multiprocessing serialization overhead
Follow the same approach as 39ffd9977e to reduce serialization overhead. Below benchmarks are tested with 2.7k projects on my workstation (warm cache). git tracing is disabled for benchmark. (seconds) | v2.48 | v2.48 | this CL | this CL | | -j32 | | -j32 ----------------------------------------------------------- with clean tree state: branches (none) | 5.6 | 5.9 | 1.0 | 0.9 status (clean) | 21.3 | 9.4 | 19.4 | 4.7 diff (none) | 7.6 | 7.2 | 5.7 | 2.2 prune (none) | 5.7 | 6.1 | 1.3 | 1.2 abandon (none) | 19.4 | 18.6 | 0.9 | 0.8 upload (none) | 19.7 | 18.7 | 0.9 | 0.8 forall -c true | 7.5 | 7.6 | 0.6 | 0.6 forall -c "git log -1" | 11.3 | 11.1 | 0.6 | 0.6 with branches: start BRANCH --all | 21.9 | 20.3 | 13.6 | 2.6 checkout BRANCH | 29.1 | 27.8 | 1.1 | 1.0 branches (2) | 28.0 | 28.6 | 1.5 | 1.3 abandon BRANCH | 29.2 | 27.5 | 9.7 | 2.2 Bug: b/371638995 Change-Id: I53989a3d1e43063587b3f52f852b1c2c56b49412 Reviewed-on: https://gerrit-review.googlesource.com/c/git-repo/+/440221 Reviewed-by: Josip Sokcevic <sokcevic@google.com> Tested-by: Kuang-che Wu <kcwu@google.com> Commit-Queue: Kuang-che Wu <kcwu@google.com>
Diffstat (limited to 'command.py')
-rw-r--r--command.py10
1 files changed, 7 insertions, 3 deletions
diff --git a/command.py b/command.py
index 2a2ce138..22115ac2 100644
--- a/command.py
+++ b/command.py
@@ -268,8 +268,10 @@ class Command:
268 cls._parallel_context = None 268 cls._parallel_context = None
269 269
270 @classmethod 270 @classmethod
271 def _SetParallelContext(cls, context): 271 def _InitParallelWorker(cls, context, initializer):
272 cls._parallel_context = context 272 cls._parallel_context = context
273 if initializer:
274 initializer()
273 275
274 @classmethod 276 @classmethod
275 def ExecuteInParallel( 277 def ExecuteInParallel(
@@ -281,6 +283,7 @@ class Command:
281 output=None, 283 output=None,
282 ordered=False, 284 ordered=False,
283 chunksize=WORKER_BATCH_SIZE, 285 chunksize=WORKER_BATCH_SIZE,
286 initializer=None,
284 ): 287 ):
285 """Helper for managing parallel execution boiler plate. 288 """Helper for managing parallel execution boiler plate.
286 289
@@ -307,6 +310,7 @@ class Command:
307 ordered: Whether the jobs should be processed in order. 310 ordered: Whether the jobs should be processed in order.
308 chunksize: The number of jobs processed in batch by parallel 311 chunksize: The number of jobs processed in batch by parallel
309 workers. 312 workers.
313 initializer: Worker initializer.
310 314
311 Returns: 315 Returns:
312 The |callback| function's results are returned. 316 The |callback| function's results are returned.
@@ -318,8 +322,8 @@ class Command:
318 else: 322 else:
319 with multiprocessing.Pool( 323 with multiprocessing.Pool(
320 jobs, 324 jobs,
321 initializer=cls._SetParallelContext, 325 initializer=cls._InitParallelWorker,
322 initargs=(cls._parallel_context,), 326 initargs=(cls._parallel_context, initializer),
323 ) as pool: 327 ) as pool:
324 submit = pool.imap if ordered else pool.imap_unordered 328 submit = pool.imap if ordered else pool.imap_unordered
325 return callback( 329 return callback(