Summary: | Cleanup action create UI freezes > 300 seconds | ||
---|---|---|---|
Product: | [Eclipse Project] JDT | Reporter: | Lars Vogel <Lars.Vogel> |
Component: | UI | Assignee: | Paul Pazderski <paul-eclipse> |
Status: | RESOLVED FIXED | QA Contact: | |
Severity: | normal | ||
Priority: | P3 | CC: | Lars.Vogel, paul-eclipse, rgrunber |
Version: | 4.13 | ||
Target Milestone: | 4.14 M1 | ||
Hardware: | PC | ||
OS: | Linux | ||
See Also: |
https://git.eclipse.org/r/148885 https://bugs.eclipse.org/bugs/show_bug.cgi?id=550744 https://git.eclipse.org/c/jdt/eclipse.jdt.ui.git/commit/?id=9d84dfa387768e9d3e0526028930c7bbf5f0f6e3 |
||
Whiteboard: | |||
Bug Depends on: | |||
Bug Blocks: | 550209 |
Description
Lars Vogel
2019-09-04 06:08:43 EDT
Roland, can you have a look? AFAIR you were working on code completion performance with a timeout before. Also adding Paul, who improved performance in the text framework in the past. A possible performance improvement: from your stacktrace it spent its time in TreeLineTracker. This class is already really fast but most requests are still not trivial. JavaIndenter requests the line every time the position is changed which is done (I assume) much more often than the line is actually required to know. Improvement is therefor to remove the line field and calculate it on demand. New Gerrit change created: https://git.eclipse.org/r/148885 (In reply to Paul Pazderski from comment #2) > A possible performance improvement: from your stacktrace it spent its time > in TreeLineTracker. This class is already really fast but most requests are > still not trivial. > JavaIndenter requests the line every time the position is changed which is > done (I assume) much more often than the line is actually required to know. > Improvement is therefor to remove the line field and calculate it on demand. Awesome Paul, with your patch the freeze is way shorter even for huge files. It is now only a 1.1 second freeze for ~100000 lines. 2.5 freeze for a larger one. Here is the new stack trace: Stack Trace at org.eclipse.jdt.internal.core.JavaModelManager.getInfo(JavaModelManager.java:2179) at org.eclipse.jdt.internal.core.JavaElement.getElementInfo(JavaElement.java:324) at org.eclipse.jdt.internal.core.JavaElement.getElementInfo(JavaElement.java:312) at org.eclipse.jdt.internal.core.Member.getNameRange(Member.java:353) at org.eclipse.jdt.ui.text.folding.DefaultJavaFoldingStructureProvider$JavaElementPosition.computeProjectionRegions(DefaultJavaFoldingStructureProvider.java:594) at org.eclipse.jface.text.source.projection.ProjectionViewer.computeCollapsedRegions(ProjectionViewer.java:1103) at org.eclipse.jface.text.source.projection.ProjectionViewer.widgetSelection2ModelSelection(ProjectionViewer.java:1624) at org.eclipse.jface.text.TextViewer.getSelectedRange(TextViewer.java:2244) at org.eclipse.jface.text.TextViewer.getSelection(TextViewer.java:2447) at org.eclipse.ui.texteditor.AbstractTextEditor.doGetSelection(AbstractTextEditor.java:2904) at org.eclipse.ui.texteditor.AbstractTextEditor$SelectionProvider.getSelection(AbstractTextEditor.java:1423) at org.eclipse.jdt.internal.ui.javaeditor.JavaEditor$JdtSelectionProvider.getSelection(JavaEditor.java:1394) at org.eclipse.jdt.internal.ui.actions.IndentAction.getSelection(IndentAction.java:774) at org.eclipse.jdt.internal.ui.actions.IndentAction.update(IndentAction.java:691) at org.eclipse.ui.texteditor.AbstractTextEditor.updateAction(AbstractTextEditor.java:5405) at org.eclipse.ui.texteditor.AbstractTextEditor.updateSelectionDependentActions(AbstractTextEditor.java:5478) at org.eclipse.ui.texteditor.AbstractTextEditor$2.lambda$0(AbstractTextEditor.java:3096) at org.eclipse.ui.texteditor.AbstractTextEditor$2$$Lambda$438/0x0000000801998440.run(Unknown Source) at org.eclipse.ui.texteditor.AbstractTextEditor$2.selectionChanged(AbstractTextEditor.java:3107) at org.eclipse.jface.viewers.Viewer$1.run(Viewer.java:151) at org.eclipse.core.runtime.SafeRunner.run(SafeRunner.java:45) at org.eclipse.ui.internal.JFaceUtil.lambda$0(JFaceUtil.java:47) at org.eclipse.ui.internal.JFaceUtil$$Lambda$74/0x00000008012aa040.run(Unknown Source) at org.eclipse.jface.util.SafeRunnable.run(SafeRunnable.java:174) at org.eclipse.jface.viewers.Viewer.fireSelectionChanged(Viewer.java:148) at org.eclipse.jface.text.TextViewer.fireSelectionChanged(TextViewer.java:2598) at org.eclipse.jface.text.TextViewer.selectionChanged(TextViewer.java:2577) at org.eclipse.jface.text.TextViewer.setSelectedRange(TextViewer.java:2271) at org.eclipse.jface.text.TextViewer.doOperation(TextViewer.java:3851) at org.eclipse.jface.text.source.SourceViewer.doOperation(SourceViewer.java:1064) at org.eclipse.jface.text.source.projection.ProjectionViewer.doOperation(ProjectionViewer.java:1466) at org.eclipse.jdt.internal.ui.javaeditor.JavaSourceViewer.doOperation(JavaSourceViewer.java:199) at org.eclipse.jdt.internal.ui.javaeditor.CompilationUnitEditor$AdaptedSourceViewer.doOperation(CompilationUnitEditor.java:206) at org.eclipse.ui.texteditor.TextOperationAction.lambda$0(TextOperationAction.java:130) at org.eclipse.ui.texteditor.TextOperationAction$$Lambda$673/0x0000000801c06c40.run(Unknown Source) at org.eclipse.swt.custom.BusyIndicator.showWhile(BusyIndicator.java:72) at org.eclipse.ui.texteditor.TextOperationAction.run(TextOperationAction.java:130) at org.eclipse.jface.action.Action.runWithEvent(Action.java:474) at org.eclipse.jface.commands.ActionHandler.execute(ActionHandler.java:121) at org.eclipse.ui.internal.handlers.E4HandlerProxy.execute(E4HandlerProxy.java:95) at jdk.internal.reflect.GeneratedMethodAccessor42.invoke(Unknown Source) at java.base@12.0.1/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.base@12.0.1/java.lang.reflect.Method.invoke(Method.java:567) at org.eclipse.e4.core.internal.di.MethodRequestor.execute(MethodRequestor.java:58) at org.eclipse.e4.core.internal.di.InjectorImpl.invokeUsingClass(InjectorImpl.java:318) at org.eclipse.e4.core.internal.di.InjectorImpl.invoke(InjectorImpl.java:252) at org.eclipse.e4.core.contexts.ContextInjectionFactory.invoke(ContextInjectionFactory.java:173) at org.eclipse.e4.core.commands.internal.HandlerServiceHandler.execute(HandlerServiceHandler.java:156) at org.eclipse.core.commands.Command.executeWithChecks(Command.java:498) at org.eclipse.core.commands.ParameterizedCommand.executeWithChecks(ParameterizedCommand.java:487) at org.eclipse.e4.core.commands.internal.HandlerServiceImpl.executeHandler(HandlerServiceImpl.java:213) at org.eclipse.e4.ui.bindings.keys.KeyBindingDispatcher.executeCommand(KeyBindingDispatcher.java:308) at org.eclipse.e4.ui.bindings.keys.KeyBindingDispatcher.press(KeyBindingDispatcher.java:584) at org.eclipse.e4.ui.bindings.keys.KeyBindingDispatcher.processKeyEvent(KeyBindingDispatcher.java:653) at org.eclipse.e4.ui.bindings.keys.KeyBindingDispatcher.filterKeySequenceBindings(KeyBindingDispatcher.java:443) at org.eclipse.e4.ui.bindings.keys.KeyBindingDispatcher.access$2(KeyBindingDispatcher.java:386) at org.eclipse.e4.ui.bindings.keys.KeyBindingDispatcher$KeyDownFilter.handleEvent(KeyBindingDispatcher.java:96) at org.eclipse.swt.widgets.EventTable.sendEvent(EventTable.java:89) at org.eclipse.swt.widgets.Display.filterEvent(Display.java:1838) at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1404) at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1431) at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1414) at org.eclipse.swt.widgets.Widget.sendKeyEvent(Widget.java:1455) at org.eclipse.swt.widgets.Widget.gtk_key_press_event(Widget.java:819) at org.eclipse.swt.widgets.Control.gtk_key_press_event(Control.java:4012) at org.eclipse.swt.widgets.Composite.gtk_key_press_event(Composite.java:857) at org.eclipse.swt.widgets.Widget.windowProc(Widget.java:2243) at org.eclipse.swt.widgets.Control.windowProc(Control.java:6846) at org.eclipse.swt.widgets.Display.windowProc(Display.java:5841) at org.eclipse.swt.internal.gtk.GTK._gtk_main_do_event(Native Method) at org.eclipse.swt.internal.gtk.GTK.gtk_main_do_event(GTK.java:4154) at org.eclipse.swt.widgets.Display.eventProc(Display.java:1476) at org.eclipse.swt.internal.gtk.OS._g_main_context_iteration(Native Method) at org.eclipse.swt.internal.gtk.OS.g_main_context_iteration(OS.java:1603) at org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:4403) at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine$5.run(PartRenderingEngine.java:1160) at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:338) at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.run(PartRenderingEngine.java:1049) at org.eclipse.e4.ui.internal.workbench.E4Workbench.createAndRunUI(E4Workbench.java:155) at org.eclipse.ui.internal.Workbench.lambda$3(Workbench.java:633) at org.eclipse.ui.internal.Workbench$$Lambda$110/0x000000080132a040.run(Unknown Source) at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:338) at org.eclipse.ui.internal.Workbench.createAndRunWorkbench(Workbench.java:557) at org.eclipse.ui.PlatformUI.createAndRunWorkbench(PlatformUI.java:150) at org.eclipse.ui.internal.ide.application.IDEApplication.start(IDEApplication.java:150) at org.eclipse.equinox.internal.app.EclipseAppHandle.run(EclipseAppHandle.java:203) at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.runApplication(EclipseAppLauncher.java:137) at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.start(EclipseAppLauncher.java:107) at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:400) at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:255) at java.base@12.0.1/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at java.base@12.0.1/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at java.base@12.0.1/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.base@12.0.1/java.lang.reflect.Method.invoke(Method.java:567) at app//org.eclipse.equinox.launcher.Main.invokeFramework(Main.java:660) at app//org.eclipse.equinox.launcher.Main.basicRun(Main.java:597) at app//org.eclipse.equinox.launcher.Main.run(Main.java:1468) at app//org.eclipse.equinox.launcher.Main.main(Main.java:1441) Opening the large file also freezes Eclipse, opened Bug 550744 for that. From my testing, I'm not able to see any noticeable difference between 4.12 (2019-06) and 4.13RC1 (2019-09). Both informed me that the formatting was taking long at around 100k lines, and ran out of heap space at around 300k lines (I used QuickAssistProcessor.java). (In reply to Roland Grunberg from comment #6) > From my testing, I'm not able to see any noticeable difference between 4.12 > (2019-06) and 4.13RC1 (2019-09). Both informed me that the formatting was > taking long at around 100k lines, and ran out of heap space at around 300k > lines (I used QuickAssistProcessor.java). It is not a regression, just slow. Gerrit change https://git.eclipse.org/r/148885 was merged to [master]. Commit: http://git.eclipse.org/c/jdt/eclipse.jdt.ui.git/commit/?id=9d84dfa387768e9d3e0526028930c7bbf5f0f6e3 Thanks Paul for the fix and Jeff for the review. |