|
Re: Potential performance problem in Xtext [message #873434 is a reply to message #872810] |
Fri, 18 May 2012 08:19 |
Sebastian Zarnekow Messages: 3118 Registered: July 2009 |
Senior Member |
|
|
Hi Alex,
Xtext tries to provide a more reasonable mapping for platform:/resource
uris than EMF does by default. What we do is basically a mapping of the
target platform to the platform:/resource scheme and platform:/plugin
schemes compared to the installed plugins which are explored by the EMF
default mapping algorithm. Therefore we have to look into the Manifest
files on the classpath of the projects. This information is save to be
cached as long as the classpath does not change. I think the best way to
cache that would be the information about the plugin-id per JAR file
path. This would allow all projects that use the same or similar deps to
use the plugin-id directly. Each JAR file would havce to be inspected
once and only once.
Does that make sense to you? Could you please provide a patch that
addresses the issue?
Regards,
Sebastian
--
Need professional support for Eclipse Modeling?
Go visit: http://xtext.itemis.com
Am 16.05.12 23:40, schrieb Alex Ruiz:
> Greetings,
>
> I think we might have found a performance problem in Xtext. Context below:
>
> Since Eclipse projects at Google are typically huge (e.g. thousands of
> source files and thousands of jar files in the classpath) any
> performance issue in Eclipse considered minor in the outside world gets
> amplified greatly in our projects. In order to find and fix any
> performance problems perceived by our users, we log delays on the UI
> thread. One of the delays we found points to Xtext.
>
> Here is the stack trace from our logging:
>
>
> java.util.zip.ZipFile.<init>(ZipFile.java:131)
> java.util.jar.JarFile.<init>(JarFile.java:150)
> java.util.jar.JarFile.<init>(JarFile.java:114)
> org.eclipse.xtext.ui.resource.XtextResourceSetProvider.computePlatformURIMap(XtextResourceSetProvider.java:68)
>
> org.eclipse.xtext.ui.resource.XtextResourceSetProvider.get(XtextResourceSetProvider.java:49)
>
> org.eclipse.xtext.ui.editor.model.ResourceForIEditorInputFactory.getResourceSet(ResourceForIEditorInputFactory.java:89)
>
> org.eclipse.xtext.ui.editor.model.JavaClassPathResourceForIEditorInputFactory.getResourceSet(JavaClassPathResourceForIEditorInputFactory.java:59)
>
> org.eclipse.xtext.ui.editor.model.ResourceForIEditorInputFactory.createResourceFor(ResourceForIEditorInputFactory.java:68)
>
> org.eclipse.xtext.ui.editor.model.ResourceForIEditorInputFactory.createResource(ResourceForIEditorInputFactory.java:64)
>
> org.eclipse.xtext.ui.editor.model.JavaClassPathResourceForIEditorInputFactory.createResource(JavaClassPathResourceForIEditorInputFactory.java:37)
>
> org.eclipse.xtext.ui.editor.model.ResourceForIEditorInputFactory.createResource(ResourceForIEditorInputFactory.java:53)
>
> org.eclipse.xtext.ui.editor.model.XtextDocumentProvider.setDocumentContent(XtextDocumentProvider.java:118)
>
> org.eclipse.ui.editors.text.StorageDocumentProvider.createDocument(StorageDocumentProvider.java:229)
>
> org.eclipse.xtext.ui.editor.model.XtextDocumentProvider.createDocument(XtextDocumentProvider.java:88)
>
> com.google.eclipse.protobuf.ui.editor.model.ProtobufDocumentProvider.createDocument(ProtobufDocumentProvider.java:74)
>
> org.eclipse.ui.editors.text.FileDocumentProvider.createElementInfo(FileDocumentProvider.java:735)
>
> org.eclipse.xtext.ui.editor.model.XtextDocumentProvider.createElementInfo(XtextDocumentProvider.java:153)
>
> com.google.eclipse.protobuf.ui.editor.model.ProtobufDocumentProvider.createElementInfo(ProtobufDocumentProvider.java:47)
>
> org.eclipse.ui.texteditor.AbstractDocumentProvider.connect(AbstractDocumentProvider.java:400)
>
> org.eclipse.ui.texteditor.AbstractTextEditor.doSetInput(AbstractTextEditor.java:4213)
>
> org.eclipse.ui.texteditor.StatusTextEditor.doSetInput(StatusTextEditor.java:237)
>
> org.eclipse.ui.texteditor.AbstractDecoratedTextEditor.doSetInput(AbstractDecoratedTextEditor.java:1451)
>
> org.eclipse.ui.editors.text.TextEditor.doSetInput(TextEditor.java:169)
> org.eclipse.xtext.ui.editor.XtextEditor.doSetInput(XtextEditor.java:215)
> org.eclipse.ui.texteditor.AbstractTextEditor$19.run(AbstractTextEditor.java:3200)
>
> org.eclipse.jface.operation.ModalContext.runInCurrentThread(ModalContext.java:464)
>
> org.eclipse.jface.operation.ModalContext.run(ModalContext.java:372)
> org.eclipse.jface.window.ApplicationWindow$1.run(ApplicationWindow.java:759)
>
> org.eclipse.swt.custom.BusyIndicator.showWhile(BusyIndicator.java:70)
> org.eclipse.jface.window.ApplicationWindow.run(ApplicationWindow.java:756)
> org.eclipse.ui.internal.WorkbenchWindow.run(WorkbenchWindow.java:2642)
> org.eclipse.ui.texteditor.AbstractTextEditor.internalInit(AbstractTextEditor.java:3218)
>
> org.eclipse.ui.texteditor.AbstractTextEditor.init(AbstractTextEditor.java:3245)
>
> org.eclipse.xtext.ui.editor.XtextEditor.init(XtextEditor.java:236)
> org.eclipse.ui.internal.EditorManager.createSite(EditorManager.java:828)
> org.eclipse.ui.internal.EditorReference.createPartHelper(EditorReference.java:647)
>
> org.eclipse.ui.internal.EditorReference.createPart(EditorReference.java:465)
>
> org.eclipse.ui.internal.WorkbenchPartReference.getPart(WorkbenchPartReference.java:595)
>
> org.eclipse.ui.internal.EditorReference.getEditor(EditorReference.java:289)
> org.eclipse.ui.internal.WorkbenchPage.busyOpenEditorBatched(WorkbenchPage.java:2945)
>
> org.eclipse.ui.internal.WorkbenchPage.busyOpenEditor(WorkbenchPage.java:2850)
>
> org.eclipse.ui.internal.WorkbenchPage.access$11(WorkbenchPage.java:2842)
> org.eclipse.ui.internal.WorkbenchPage$10.run(WorkbenchPage.java:2793)
> org.eclipse.swt.custom.BusyIndicator.showWhile(BusyIndicator.java:70)
> org.eclipse.ui.internal.WorkbenchPage.openEditor(WorkbenchPage.java:2789)
> org.eclipse.ui.internal.WorkbenchPage.openEditor(WorkbenchPage.java:2773)
> org.eclipse.ui.internal.WorkbenchPage.openEditor(WorkbenchPage.java:2756)
> org.eclipse.ui.internal.ide.EditorAreaDropAdapter.openNonExternalEditor(EditorAreaDropAdapter.java:277)
>
> org.eclipse.ui.internal.ide.EditorAreaDropAdapter.asyncDrop(EditorAreaDropAdapter.java:99)
>
> org.eclipse.ui.internal.ide.EditorAreaDropAdapter.access$0(EditorAreaDropAdapter.java:87)
>
> org.eclipse.ui.internal.ide.EditorAreaDropAdapter$1.run(EditorAreaDropAdapter.java:81)
>
> org.eclipse.swt.widgets.RunnableLock.run(RunnableLock.java:35)
> org.eclipse.swt.widgets.Synchronizer.runAsyncMessages(Synchronizer.java:135)
>
> org.eclipse.swt.widgets.Display.runAsyncMessages(Display.java:3563)
> org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:3212)
>
>
> (Please ignore the "ProtobufDocumentProvider.createDocument" line, it is
> just delegating to super)
>
> According to our logs, the call to
> XtextResourceSetProvider.computePlatformURIMap(IJavaProject) takes a
> minute. It may not sound like too much but have found other delays and
> when they all add up, it is a major annoyance to our users.
> I've been reading Xtext code, and I fail to get the big picture here. I
> have some questions:
>
> 1. Why Xtext has too read jar files in the project's classpath?
> 2. Does it have to it every time a XtextDocument is created, or can it
> be cached somehow?
>
> Many thanks in advance,
> -Alex
|
|
|
Re: Potential performance problem in Xtext [message #873461 is a reply to message #872810] |
Fri, 18 May 2012 09:29 |
Ed Willink Messages: 7655 Registered: July 2009 |
Senior Member |
|
|
Hi Alex
EMF via extension points does a good job of making registered models
available to applications. Compiled Java models are easy, interactive
models require a bit more skill, but it works.
Many Eclipse users find considerable difficulties in a standalone
environment for which all the extension point functionality is missing.
itemis provided a nice, but IMHO partial, solution to this in MWE2's
StandaloneSetup by scanning the classpath for .project and MANIFEST.MF
files to populate platform:/resource mappings. Inspired by this, OCL's
StandaloneProjectMap does a similar scan but also looking at plugin.xml
and any referenced *.genmodel so that registered packages and
platform:/plugin are also URI-mapped.
These approaches are user friendly; try to provide everything so that
the one or two declarations actually required are available. As you've
observed, they scale poorly, unless you take very tight control over the
classpath. But re-using the classpath that is configured for Java
package location for model location is inefficient; perhaps 10%, perhaps
just 1% of classpath entries are model-providing.
org.eclipse.ocl.examples.domain.utilities.StandaloneProjectMap is
shareable, but currently has no classpath monitoring, so it can go
stale. You can override getProjectDescriptors() or scanClassPath() to
eliminate the 90% or even 99% of plugins that you know to be
non-model-providing.
Or you can reuse the registration technology to manually install only
those entries that you know to be useful.
Perhaps you can evolve the MWE2, Xtext, OCL ideas so that
https://bugs.eclipse.org/bugs/show_bug.cgi?id=361063 matures into a
generally useful EMF facility.
Regards
Ed Willink
On 16/05/2012 22:40, Alex Ruiz wrote:
> Greetings,
>
> I think we might have found a performance problem in Xtext. Context
> below:
>
> Since Eclipse projects at Google are typically huge (e.g. thousands of
> source files and thousands of jar files in the classpath) any
> performance issue in Eclipse considered minor in the outside world
> gets amplified greatly in our projects. In order to find and fix any
> performance problems perceived by our users, we log delays on the UI
> thread. One of the delays we found points to Xtext.
>
> Here is the stack trace from our logging:
>
>
> java.util.zip.ZipFile.<init>(ZipFile.java:131)
> java.util.jar.JarFile.<init>(JarFile.java:150)
> java.util.jar.JarFile.<init>(JarFile.java:114)
> org.eclipse.xtext.ui.resource.XtextResourceSetProvider.computePlatformURIMap(XtextResourceSetProvider.java:68)
>
> org.eclipse.xtext.ui.resource.XtextResourceSetProvider.get(XtextResourceSetProvider.java:49)
>
> org.eclipse.xtext.ui.editor.model.ResourceForIEditorInputFactory.getResourceSet(ResourceForIEditorInputFactory.java:89)
>
> org.eclipse.xtext.ui.editor.model.JavaClassPathResourceForIEditorInputFactory.getResourceSet(JavaClassPathResourceForIEditorInputFactory.java:59)
>
> org.eclipse.xtext.ui.editor.model.ResourceForIEditorInputFactory.createResourceFor(ResourceForIEditorInputFactory.java:68)
>
> org.eclipse.xtext.ui.editor.model.ResourceForIEditorInputFactory.createResource(ResourceForIEditorInputFactory.java:64)
>
> org.eclipse.xtext.ui.editor.model.JavaClassPathResourceForIEditorInputFactory.createResource(JavaClassPathResourceForIEditorInputFactory.java:37)
>
> org.eclipse.xtext.ui.editor.model.ResourceForIEditorInputFactory.createResource(ResourceForIEditorInputFactory.java:53)
>
> org.eclipse.xtext.ui.editor.model.XtextDocumentProvider.setDocumentContent(XtextDocumentProvider.java:118)
>
> org.eclipse.ui.editors.text.StorageDocumentProvider.createDocument(StorageDocumentProvider.java:229)
>
> org.eclipse.xtext.ui.editor.model.XtextDocumentProvider.createDocument(XtextDocumentProvider.java:88)
>
> com.google.eclipse.protobuf.ui.editor.model.ProtobufDocumentProvider.createDocument(ProtobufDocumentProvider.java:74)
>
> org.eclipse.ui.editors.text.FileDocumentProvider.createElementInfo(FileDocumentProvider.java:735)
>
> org.eclipse.xtext.ui.editor.model.XtextDocumentProvider.createElementInfo(XtextDocumentProvider.java:153)
>
> com.google.eclipse.protobuf.ui.editor.model.ProtobufDocumentProvider.createElementInfo(ProtobufDocumentProvider.java:47)
>
> org.eclipse.ui.texteditor.AbstractDocumentProvider.connect(AbstractDocumentProvider.java:400)
>
> org.eclipse.ui.texteditor.AbstractTextEditor.doSetInput(AbstractTextEditor.java:4213)
>
> org.eclipse.ui.texteditor.StatusTextEditor.doSetInput(StatusTextEditor.java:237)
>
> org.eclipse.ui.texteditor.AbstractDecoratedTextEditor.doSetInput(AbstractDecoratedTextEditor.java:1451)
>
> org.eclipse.ui.editors.text.TextEditor.doSetInput(TextEditor.java:169)
> org.eclipse.xtext.ui.editor.XtextEditor.doSetInput(XtextEditor.java:215)
> org.eclipse.ui.texteditor.AbstractTextEditor$19.run(AbstractTextEditor.java:3200)
>
> org.eclipse.jface.operation.ModalContext.runInCurrentThread(ModalContext.java:464)
>
> org.eclipse.jface.operation.ModalContext.run(ModalContext.java:372)
> org.eclipse.jface.window.ApplicationWindow$1.run(ApplicationWindow.java:759)
>
> org.eclipse.swt.custom.BusyIndicator.showWhile(BusyIndicator.java:70)
> org.eclipse.jface.window.ApplicationWindow.run(ApplicationWindow.java:756)
>
> org.eclipse.ui.internal.WorkbenchWindow.run(WorkbenchWindow.java:2642)
> org.eclipse.ui.texteditor.AbstractTextEditor.internalInit(AbstractTextEditor.java:3218)
>
> org.eclipse.ui.texteditor.AbstractTextEditor.init(AbstractTextEditor.java:3245)
>
> org.eclipse.xtext.ui.editor.XtextEditor.init(XtextEditor.java:236)
> org.eclipse.ui.internal.EditorManager.createSite(EditorManager.java:828)
> org.eclipse.ui.internal.EditorReference.createPartHelper(EditorReference.java:647)
>
> org.eclipse.ui.internal.EditorReference.createPart(EditorReference.java:465)
>
> org.eclipse.ui.internal.WorkbenchPartReference.getPart(WorkbenchPartReference.java:595)
>
> org.eclipse.ui.internal.EditorReference.getEditor(EditorReference.java:289)
>
> org.eclipse.ui.internal.WorkbenchPage.busyOpenEditorBatched(WorkbenchPage.java:2945)
>
> org.eclipse.ui.internal.WorkbenchPage.busyOpenEditor(WorkbenchPage.java:2850)
>
> org.eclipse.ui.internal.WorkbenchPage.access$11(WorkbenchPage.java:2842)
> org.eclipse.ui.internal.WorkbenchPage$10.run(WorkbenchPage.java:2793)
> org.eclipse.swt.custom.BusyIndicator.showWhile(BusyIndicator.java:70)
> org.eclipse.ui.internal.WorkbenchPage.openEditor(WorkbenchPage.java:2789)
> org.eclipse.ui.internal.WorkbenchPage.openEditor(WorkbenchPage.java:2773)
> org.eclipse.ui.internal.WorkbenchPage.openEditor(WorkbenchPage.java:2756)
> org.eclipse.ui.internal.ide.EditorAreaDropAdapter.openNonExternalEditor(EditorAreaDropAdapter.java:277)
>
> org.eclipse.ui.internal.ide.EditorAreaDropAdapter.asyncDrop(EditorAreaDropAdapter.java:99)
>
> org.eclipse.ui.internal.ide.EditorAreaDropAdapter.access$0(EditorAreaDropAdapter.java:87)
>
> org.eclipse.ui.internal.ide.EditorAreaDropAdapter$1.run(EditorAreaDropAdapter.java:81)
>
> org.eclipse.swt.widgets.RunnableLock.run(RunnableLock.java:35)
> org.eclipse.swt.widgets.Synchronizer.runAsyncMessages(Synchronizer.java:135)
>
> org.eclipse.swt.widgets.Display.runAsyncMessages(Display.java:3563)
> org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:3212)
>
>
> (Please ignore the "ProtobufDocumentProvider.createDocument" line, it
> is just delegating to super)
>
> According to our logs, the call to
> XtextResourceSetProvider.computePlatformURIMap(IJavaProject) takes a
> minute. It may not sound like too much but have found other delays and
> when they all add up, it is a major annoyance to our users.
> I've been reading Xtext code, and I fail to get the big picture here.
> I have some questions:
>
> 1. Why Xtext has too read jar files in the project's classpath?
> 2. Does it have to it every time a XtextDocument is created, or can it
> be cached somehow?
>
> Many thanks in advance,
> -Alex
|
|
|
|
|
|
Powered by
FUDForum. Page generated in 0.03435 seconds