Maven performance needs improvement
-----------------------------------

                 Key: MNG-3647
                 URL: http://jira.codehaus.org/browse/MNG-3647
             Project: Maven 2
          Issue Type: Bug
    Affects Versions: 2.0.8
            Reporter: Ittay Dror


I have a multi-module project with 40 modules. Running 'install' with no 
compilation takes 30 seconds. Running 'compile' takes 18 seconds. This is very 
high IMHO. Buildr (written in Ruby - a scripted language) takes 1 second). In 
'compile', adding time measurements to the mojo executions showed a cumulative 
time of 4.8 seconds. (Note that I ran maven several times, so all files are in 
the buffer cache)

I've profiled the code to find obvious bottlenecks. Here is what I could easily 
fix:
a. reading component configuration: in maven-uber jar there are 9 
configurations that maven read and parsed 2394 times. I added a simple HashMap 
cache to return the already parsed configuration. Note that this suggest a lot 
of inefficiency in the maven code itself. 
b. ComponentValueSetter is used to set values in Mojos. It is created per field 
and always tries to find the field again. This showed high during profiling. I 
implemented a cache but I'm not sure whether this matters much 
c. in plexus, component discovery is done a lot of times - every time a jar is 
added to the container after it is started. this does a lot of xml parsing. I 
added code to disable component discovery temporarily and start it again. I 
call it from DefaultLifecycleExecutor.findExtensions at the start and end of 
the method. Also from DefaultPluginManager.ensurePluginContainerIsComplete.
d. in DefaultRepositoryMetadataManager the function readMetadata always loads 
the metadata file and parses it. I have added a cache (although without paying 
attention to timestamps)

Also, I ran java with the flags -client -dsa -da -Xnoclassgc -Xbatch -Xincgc.  
This shaved 3 seconds.

All the above steps caused the time to drop to 8 seconds. Meaning 3 seconds due 
to JVM flags and 7 seconds of actions that could easily be avoided.

There are other issues which are harder to tackle:
1. profiling shows that Xpp3DomBuilder is called a lot of times. Since it is 
called with a Reader/InputStream I can't easily implement a cache here. 
2. jar files are always created and always installed. unlike the above actions, 
where the files were in the buffer cache, here actual IO occurs. 



-- 
This message is automatically generated by JIRA.
-
If you think it was sent incorrectly contact one of the administrators: 
http://jira.codehaus.org/secure/Administrators.jspa
-
For more information on JIRA, see: http://www.atlassian.com/software/jira

        

Reply via email to