Hi,
i´m doing some profiling. We have a project with ~200 modules/bundles. The build takes with maven (not tycho) 3 min, in parallel (wth -T 2C maven parameter) only 1 min 10 sec. IntelliJ IDEA need only 8 minutes but eclipse ~ 30 minutes! The Eclipse installation has no know CPU-eaters like Subclipse or mylyn Context (=Resource changed listeners evaluting every change of .class). I eliminated the influence of harddrive and I/O-Operaions with SSD and the maschine has enough of RAM (no swap)
I did a profiling with YouKitProfiler and the of "Hot Spots by object count" is the method simplifyWithParent with ~ 100 mil of allocations of
org.eclipse.core.internal.dtree.AbstractDataTreeNode[]
org.eclipse.core.internal.dtree.DataDeltaNode
org.eclipse.core.internal.dtree.NoDataDeltaNode
java.lang.String[]
org.eclipse.core.runtime.Path
org.eclipse.core.internal.dtree.DataTreeNode
I don't know the purpose of the code, but here are some wild guesses:
A) simplifyWithParent creates e new instance of Path with key.append(String). Path instance ist a representation of /a/path/to/a/file/ and thus probably immutable. if it is really immutable, is a pool of Paths possible ? In this case the created Path instance very short-lived and it provides only a info about a path for org.eclipse.core.internal.dtree.AbstractDataTreeNode.simplifyWithParent(IPath, DeltaDataTree, IComparator) implementations.
B) node.simplifyWithParent returns simplifiedNode.isEmptyDelta() : true for NoDataDeltaNode. In this case, the NoDataDeltaNode instance is very short-lived, used for simplifiedNode.isEmptyDelta() only. Is it possible to use null-return-values as empty delta ? (Most likely not - it must be backward-compatible). What about a new method then?
Other infos: the tested enviroment ist eclipse kepler with m2e plugin. No other plugin installed. The m2e / maven plugins self consumes a lot, but I will discuss it in m2e devel mailing list. There is most likely a problem with hiearchical layout too. Sometimes are some resources processed (with simplifyWithParent) 2x : first in a bar.foo.subproject self and next time in bar.foo.parent.project/bar.foo.subproject. I'll investigate it more.