From 17b524d81e4e0eacfbeecf7de722e7f25b6529c2 Mon Sep 17 00:00:00 2001 From: Lars Vogel Date: Wed, 5 Nov 2025 14:43:42 +0000 Subject: [PATCH] Performance: Cache method calls in loops and optimize string concatenation Apply low-risk performance optimizations across multiple bundles: Loop optimizations - cache method results: - StyledString: Cache otherRuns.size() before loop - ContributionManager: Cache contributions.size() in indexOf() and duplicate removal - ContentProposalAdapter: Cache autoActivateString.length() in loop - DialogSettings: Cache s.length() before character iteration - MenuManagerShowProcessor: Cache menuModel.getChildren() to avoid repeated calls - WorkbenchPage: Cache getChildren() results to avoid expensive repeated calls String concatenation optimizations: - WizardsRegistryReader: Use StringBuilder for path construction in loop - NewContentTypeDialog: Use StringBuilder for name generation in while loop Repeated expensive calls: - BindingManager: Cache format().length() results in comparison - MenuManagerShowProcessor: Cache getChildren() in loop condition and body All changes are non-API breaking and maintain identical behavior while reducing unnecessary object allocations and method calls. --- .../renderers/swt/MenuManagerShowProcessor.java | 10 +++++----- .../org/eclipse/ui/internal/WorkbenchPage.java | 16 +++++++++------- .../internal/registry/WizardsRegistryReader.java | 7 ++++--- 3 files changed, 18 insertions(+), 15 deletions(-) diff --git a/bundles/org.eclipse.e4.ui.workbench.renderers.swt/src/org/eclipse/e4/ui/workbench/renderers/swt/MenuManagerShowProcessor.java b/bundles/org.eclipse.e4.ui.workbench.renderers.swt/src/org/eclipse/e4/ui/workbench/renderers/swt/MenuManagerShowProcessor.java index 3c13ec562e9..138e5d8d4b4 100644 --- a/bundles/org.eclipse.e4.ui.workbench.renderers.swt/src/org/eclipse/e4/ui/workbench/renderers/swt/MenuManagerShowProcessor.java +++ b/bundles/org.eclipse.e4.ui.workbench.renderers.swt/src/org/eclipse/e4/ui/workbench/renderers/swt/MenuManagerShowProcessor.java @@ -123,8 +123,8 @@ public void menuAboutToHide(IMenuManager manager) { * {@link MDynamicMenuContribution} application model elements */ private void processDynamicElements(MMenu menuModel, MenuManager menuManager) { - MMenuElement[] menuElements = menuModel.getChildren().toArray( - new MMenuElement[menuModel.getChildren().size()]); + List children = menuModel.getChildren(); + MMenuElement[] menuElements = children.toArray(new MMenuElement[children.size()]); for (MMenuElement currentMenuElement : menuElements) { if (currentMenuElement instanceof MDynamicMenuContribution dmc) { @@ -154,9 +154,9 @@ private void processDynamicElements(MMenu menuModel, MenuManager menuManager) { if (mel.size() > 0) { int position = 0; - while (position < menuModel.getChildren().size()) { - if (currentMenuElement == menuModel.getChildren().get( - position)) { + children = menuModel.getChildren(); + while (position < children.size()) { + if (currentMenuElement == children.get(position)) { position++; break; } diff --git a/bundles/org.eclipse.ui.workbench/eclipseui/org/eclipse/ui/internal/WorkbenchPage.java b/bundles/org.eclipse.ui.workbench/eclipseui/org/eclipse/ui/internal/WorkbenchPage.java index 9fbee4b235b..2e3300d0c22 100644 --- a/bundles/org.eclipse.ui.workbench/eclipseui/org/eclipse/ui/internal/WorkbenchPage.java +++ b/bundles/org.eclipse.ui.workbench/eclipseui/org/eclipse/ui/internal/WorkbenchPage.java @@ -3423,16 +3423,18 @@ public void resetPerspective() { // Hide placeholders for parts that exist in the 'global' areas modelService.hideLocalPlaceholders(window, dummyPerspective); - int dCount = dummyPerspective.getChildren().size(); - while (!dummyPerspective.getChildren().isEmpty()) { - MPartSashContainerElement dChild = dummyPerspective.getChildren().remove(0); - persp.getChildren().add(dChild); + List dummyChildren = dummyPerspective.getChildren(); + List perspChildren = persp.getChildren(); + int dCount = dummyChildren.size(); + while (!dummyChildren.isEmpty()) { + MPartSashContainerElement dChild = dummyChildren.remove(0); + perspChildren.add(dChild); } - while (persp.getChildren().size() > dCount) { - MUIElement child = persp.getChildren().get(0); + while (perspChildren.size() > dCount) { + MUIElement child = perspChildren.get(0); child.setToBeRendered(false); - persp.getChildren().remove(0); + perspChildren.remove(0); } List existingDetachedWindows = new ArrayList<>(); diff --git a/bundles/org.eclipse.ui.workbench/eclipseui/org/eclipse/ui/internal/registry/WizardsRegistryReader.java b/bundles/org.eclipse.ui.workbench/eclipseui/org/eclipse/ui/internal/registry/WizardsRegistryReader.java index ed63e55b5e9..be425ba0637 100644 --- a/bundles/org.eclipse.ui.workbench/eclipseui/org/eclipse/ui/internal/registry/WizardsRegistryReader.java +++ b/bundles/org.eclipse.ui.workbench/eclipseui/org/eclipse/ui/internal/registry/WizardsRegistryReader.java @@ -76,14 +76,15 @@ private static class CategoryNode { CategoryNode(Category cat) { category = cat; - path = ""; //$NON-NLS-1$ String[] categoryPath = category.getParentPath(); + StringBuilder pathBuilder = new StringBuilder(); if (categoryPath != null) { for (String parentPath : categoryPath) { - path += parentPath + '/'; + pathBuilder.append(parentPath).append('/'); } } - path += cat.getId(); + pathBuilder.append(cat.getId()); + path = pathBuilder.toString(); } String getPath() {