summaryrefslogtreecommitdiffstats
path: root/subcmds/branches.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 /subcmds/branches.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 'subcmds/branches.py')
-rw-r--r--subcmds/branches.py49
1 files changed, 26 insertions, 23 deletions
diff --git a/subcmds/branches.py b/subcmds/branches.py
index 59b5cb28..08c6389c 100644
--- a/subcmds/branches.py
+++ b/subcmds/branches.py
@@ -98,6 +98,22 @@ is shown, then the branch appears in all projects.
98""" 98"""
99 PARALLEL_JOBS = DEFAULT_LOCAL_JOBS 99 PARALLEL_JOBS = DEFAULT_LOCAL_JOBS
100 100
101 @classmethod
102 def _ExpandProjectToBranches(cls, project_idx):
103 """Expands a project into a list of branch names & associated info.
104
105 Args:
106 project_idx: project.Project index
107
108 Returns:
109 List[Tuple[str, git_config.Branch, int]]
110 """
111 branches = []
112 project = cls.get_parallel_context()["projects"][project_idx]
113 for name, b in project.GetBranches().items():
114 branches.append((name, b, project_idx))
115 return branches
116
101 def Execute(self, opt, args): 117 def Execute(self, opt, args):
102 projects = self.GetProjects( 118 projects = self.GetProjects(
103 args, all_manifests=not opt.this_manifest_only 119 args, all_manifests=not opt.this_manifest_only
@@ -107,17 +123,20 @@ is shown, then the branch appears in all projects.
107 project_cnt = len(projects) 123 project_cnt = len(projects)
108 124
109 def _ProcessResults(_pool, _output, results): 125 def _ProcessResults(_pool, _output, results):
110 for name, b in itertools.chain.from_iterable(results): 126 for name, b, project_idx in itertools.chain.from_iterable(results):
127 b.project = projects[project_idx]
111 if name not in all_branches: 128 if name not in all_branches:
112 all_branches[name] = BranchInfo(name) 129 all_branches[name] = BranchInfo(name)
113 all_branches[name].add(b) 130 all_branches[name].add(b)
114 131
115 self.ExecuteInParallel( 132 with self.ParallelContext():
116 opt.jobs, 133 self.get_parallel_context()["projects"] = projects
117 expand_project_to_branches, 134 self.ExecuteInParallel(
118 projects, 135 opt.jobs,
119 callback=_ProcessResults, 136 self._ExpandProjectToBranches,
120 ) 137 range(len(projects)),
138 callback=_ProcessResults,
139 )
121 140
122 names = sorted(all_branches) 141 names = sorted(all_branches)
123 142
@@ -191,19 +210,3 @@ is shown, then the branch appears in all projects.
191 else: 210 else:
192 out.write(" in all projects") 211 out.write(" in all projects")
193 out.nl() 212 out.nl()
194
195
196def expand_project_to_branches(project):
197 """Expands a project into a list of branch names & associated information.
198
199 Args:
200 project: project.Project
201
202 Returns:
203 List[Tuple[str, git_config.Branch]]
204 """
205 branches = []
206 for name, b in project.GetBranches().items():
207 b.project = project
208 branches.append((name, b))
209 return branches