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
List list= (List) cached;
					list.remove(annotation);
					if (list.size() == 1) {
						fReverseMap.put(position, list.get(0));
						list.clear();
					}
				} else if (cached instanceof Annotation) {
					fReverseMap.remove(position);
				}
				super.removeAnnotation(annotation, fireModelChanged);
			}
		}
		
		
		protected static class GlobalAnnotationModelListener implements IAnnotationModelListener, IAnnotationModelListenerExtension {
			
			private ListenerList fListenerList;
			
			public GlobalAnnotationModelListener() {
				fListenerList= new ListenerList();
			}
			
			/**
			 * @see IAnnotationModelListener#modelChanged(IAnnotationModel)
			 */
			public void modelChanged(IAnnotationModel model) {
				Object[] listeners= fListenerList.getListeners();
				for (int i= 0; i < listeners.length; i++) {
					((IAnnotationModelListener) listeners[i]).modelChanged(model);
				}