Bug 43766 [reconciling] ResourceMarkerAnnotationModel listener taking a long time
Build: I20030925 I was investigating a situation where adding breakpoints to a large file was very slow. It can take up to a second to add a breakpoint to a file such as Workspace.java (2000 lines). Almost all of this time is in the resource change listener added by ResourceMarkerAnnotationModel. First, a minor issue: Instead of adding a resource change listener that traverses the entire delta, you can locate a given resource delta within the resource change delta very quickly using IResourceDelta.findMember(): public void resourceChanged(IResourceChangeEvent e) { IResourceDelta delta= e.getDelta(); if (delta != null) { IResourceDelta child = delta.findMember(fResource.getFullPath()); if (child != null) update(child.getMarkerDeltas()); } } However, this was only a small speed improvement. The main problem is that the entire compilation unit is reparsed every time a breakpoint is added. I have added a profiler trace of where the time is going for adding a single breakpoint.
org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/javaeditor/filebuffers/CompilationUnitDocumentProvider2.java
IJavaProject jProject= info.fCopy.getJavaProject();
			if (jProject == null || !jProject.getProject().hasNature(JavaCore.NATURE_ID)) {
				super.saveDocument(monitor, element, ignore, overwrite);
				return;
			}
			synchronized (info.fCopy) {
				info.fCopy.reconcile();
			}
			
			ICompilationUnit original= (ICompilationUnit) info.fCopy.getOriginalElement();
			IResource resource= original.getResource();
			
			if (resource == null) {
				
				super.saveDocument(monitor, element, ignore, overwrite);
				return;
			}
				
			if (fSavePolicy != null)
				fSavePolicy.preSave(info.fCopy);
			
			try {
				
				fIsAboutToSave= true;
				
				if (JavaPlugin.USE_WORKING_COPY_OWNERS) {
					info.fCopy.commitWorkingCopy(overwrite, monitor);
				} else {
					info.fCopy.commit(overwrite, monitor);