[
Date Prev][
Date Next][
Thread Prev][
Thread Next][
Date Index][
Thread Index]
[
List Home]
classpath initialization/ build performance, was: RE: [platform-core-dev] Issues with large-scale development
|
Hi!
One issue that is very frustating to our users is the startup and build
performance. Of course the build issue has improved a little bit with
the background work but there are still some issues we see very often.
1. Classpath container initialization
We have a custom classpath container that reads a properties file in a
workspace project. A typical workspace has around 50 projects in it.
When Eclipse is started it takes a long time to come up with such a
workspace on a ClearCase dynamic view. It is slightly better with
snapshot views. During debugging/tracing I noticed that initializing the
classpath containers in all projects takes an significant amount of time
and that this operation is performed in the main thread which prevents
the workbench window from coming up.
Thread [main] (Suspended)
RequiredCartridgeClassPathContainer(CartridgeClassPathContainer).getClas
spathEntries() line: 121
ClasspathEntry.validateClasspathEntry(IJavaProject,
IClasspathEntry, boolean, boolean) line: 1022
JavaProject.getResolvedClasspath(IClasspathEntry[], IPath,
boolean, boolean, Map) line: 1861
DeltaProcessingState$ProjectUpdateInfo.updateProjectReferencesIfNecessar
y() line: 98
DeltaProcessingState.performClasspathResourceChange(JavaProject,
IClasspathEntry[], IClasspathEntry[], IClasspathEntry[], boolean) line:
223
SetClasspathOperation.updateProjectReferencesIfNecessary() line:
771
SetClasspathOperation.executeOperation() line: 246
SetClasspathOperation(JavaModelOperation).run(IProgressMonitor)
line: 700
Workspace.run(IWorkspaceRunnable, ISchedulingRule, int,
IProgressMonitor) line: 1673
SetClasspathOperation(JavaModelOperation).runOperation(IProgressMonitor)
line: 744
JavaProject.setRawClasspath(IClasspathEntry[], IPath,
IProgressMonitor, boolean, IClasspathEntry[], boolean, boolean) line:
2658
JavaCore$3.run(IProgressMonitor) line: 3433
BatchOperation.executeOperation() line: 34
BatchOperation(JavaModelOperation).run(IProgressMonitor) line:
700
Workspace.run(IWorkspaceRunnable, ISchedulingRule, int,
IProgressMonitor) line: 1673
JavaCore.run(IWorkspaceRunnable, ISchedulingRule,
IProgressMonitor) line: 3246
JavaCore.setClasspathContainer(IPath, IJavaProject[],
IClasspathContainer[], IProgressMonitor) line: 3416
BeehiveClassPathInitializer.initialize(IPath, IJavaProject)
line: 57
JavaModelManager.initializeContainer(IJavaProject, IPath) line:
1261
JavaModelManager.initializeAllContainers(IJavaProject, IPath)
line: 1226
JavaModelManager.getClasspathContainer(IPath, IJavaProject)
line: 833
JavaCore.getClasspathContainer(IPath, IJavaProject) line: 1184
JavaProject.getResolvedClasspath(IClasspathEntry[], IPath,
boolean, boolean, Map) line: 1889
JavaProject.getResolvedClasspath(boolean, boolean, boolean)
line: 1799
PackageFragmentRoot.isOnClasspath() line: 805
PackageFragmentRoot.exists() line: 356
PackageFragmentProvider.getChildren(Object) line: 75
PackageExplorerContentProvider.getChildren(Object) line: 127
PackageExplorerPart$PackageExplorerProblemTreeViewer.isExpandable(Object
) line: 260
PackageExplorerPart$PackageExplorerProblemTreeViewer(AbstractTreeViewer)
.updatePlus(Item, Object) line: 1587
PackageExplorerPart$PackageExplorerProblemTreeViewer(AbstractTreeViewer)
.createTreeItem(Widget, Object, int) line: 382
AbstractTreeViewer$1.run() line: 361
BusyIndicator.showWhile(Display, Runnable) line: 69
PackageExplorerPart$PackageExplorerProblemTreeViewer(AbstractTreeViewer)
.createChildren(Widget) line: 342
AbstractTreeViewer$5.run() line: 787
PackageExplorerPart$PackageExplorerProblemTreeViewer(StructuredViewer).p
reservingSelection(Runnable) line: 862
PackageExplorerPart$PackageExplorerProblemTreeViewer(AbstractTreeViewer)
.inputChanged(Object, Object) line: 777
PackageExplorerPart$PackageExplorerProblemTreeViewer(ContentViewer).setI
nput(Object) line: 238
PackageExplorerPart$PackageExplorerProblemTreeViewer(StructuredViewer).s
etInput(Object) line: 1059
PackageExplorerPart.createPartControl(Composite) line: 475
PartPane$2.run() line: 137
InternalPlatform.run(ISafeRunnable) line: 616
Platform.run(ISafeRunnable) line: 747
ViewPane(PartPane).createChildControl() line: 133
ViewPane.createChildControl() line: 135
ViewFactory$1.run() line: 351
InternalPlatform.run(ISafeRunnable) line: 616
Platform.run(ISafeRunnable) line: 747
ViewFactory.busyRestoreView(IViewReference) line: 273
ViewFactory$2.run() line: 530
BusyIndicator.showWhile(Display, Runnable) line: 69
ViewFactory.restoreView(IViewReference) line: 528
ViewFactory$ViewReference.getPart(boolean) line: 102
WorkbenchPage$1.propertyChange(PropertyChangeEvent) line: 132
ViewPane(LayoutPart).setVisible(boolean) line: 268
ViewPane(PartPane).setVisible(boolean) line: 317
ViewPane.setVisible(boolean) line: 568
PresentablePart.setVisible(boolean) line: 122
DefaultViewPresentation(DefaultPartPresentation).selectPart(IPresentable
Part) line: 1116
ViewStack(PartStack).refreshPresentationSelection() line: 946
ViewStack(PartStack).createControl(Composite, StackPresentation)
line: 467
ViewStack(PartStack).createControl(Composite) line: 367
ViewSashContainer(PartSashContainer).createControl(Composite)
line: 432
PerspectiveHelper.activate(Composite) line: 155
Perspective.onActivate() line: 732
WorkbenchPage.onActivate() line: 2063
WorkbenchWindow$4.run() line: 1858
BusyIndicator.showWhile(Display, Runnable) line: 69
WorkbenchWindow.setActivePage(IWorkbenchPage) line: 1845
WorkbenchWindow.restoreState(IMemento, IPerspectiveDescriptor)
line: 1409
Workbench.restoreState(IMemento) line: 1224
Workbench.access$10(Workbench, IMemento) line: 1185
Workbench$13.run() line: 1096
InternalPlatform.run(ISafeRunnable) line: 616
Platform.run(ISafeRunnable) line: 747
Workbench.restoreState() line: 1029
WorkbenchConfigurer.restoreState() line: 167
IDEWorkbenchAdvisor(WorkbenchAdvisor).openWindows() line: 652
Workbench.init(Display) line: 819
Workbench.runUI() line: 1325
Workbench.createAndRunWorkbench(Display, WorkbenchAdvisor) line:
254
PlatformUI.createAndRunWorkbench(Display, WorkbenchAdvisor)
line: 141
IDEApplication.run(Object) line: 96
PlatformActivator$1.run(Object) line: 335
EclipseStarter.run(Object) line: 273
EclipseStarter.run(String[], Runnable) line: 129
NativeMethodAccessorImpl.invoke0(Method, Object, Object[]) line:
not available [native method]
NativeMethodAccessorImpl.invoke(Object, Object[]) line: 39
DelegatingMethodAccessorImpl.invoke(Object, Object[]) line: 25
Method.invoke(Object, Object[]) line: 324
Main.basicRun(String[]) line: 185
Main.run(String[]) line: 704
Main.main(String[]) line: 688
2. Builder and incremental builders etc.
For historical reasons we have one directory called "javasource" in our
project structure where all Java source files resides in. In some
projects the number of files exceeds 5000 files with less than 0.1%
other than Java source files. One of the most seen tasks during a build
(IProgressMonitor feedback ;) is "Copying resources to the output
folder". Ahm I can't say how often people complain about this. On some
projects it takes more than 8 minutes although only a few source files
changed (the compile is fast).
Another feature request would be the ability to have control over the
JDT builder. For example, to set some per project options for specific
project natures (project persistent properties) like "don't generate
output" (don' generate .class files, don't copy resource, just generate
annotations).
Cu, Gunnar