Announcement Announcement Module
Collapse
No announcement yet.
AspectJ poor performance Page Title Module
Move Remove Collapse
X
Conversation Detail Module
Collapse
  • Filter
  • Time
  • Show
Clear All
new posts

  • AspectJ poor performance

    I am redoing an old project using Roo. I've got a database schema already populated with data which I have reverse engineered into a domain model using Roo's dbre. The program needs to to read an XML file, create a graph of domain objects populated with parsed XML data and persist the objects to the datastore.

    With AspectJ in the project, this code is executing an order of magnitude slower than it should. Parsing takes about 6000ms, and persisting the data takes over 10 minutes. The same code in a project configured without AspectJ takes 150ms and 40s, respectively. After removing AspectJ from the Roo generated files (all .aj code pushed in, removed AspectJ project nature in STS, removed aspectj-maven-pluign) the performance is as expected (the XML parser is roughly 40 times faster, whereas I couldn't test the part where data is persisted due to EntityManager being configured for weaving using AspectJ).

    pom.xml snippets (some configuration omitted due to text length constraint):
    Code:
    ...
    	<properties>
    		<aspectj.version>1.6.12</aspectj.version>
    		<java.version>1.6</java.version>
    		<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    		<roo.version>1.2.0.RELEASE</roo.version>
    		<slf4j.version>1.6.2</slf4j.version>
    		<spring.version>3.1.0.RELEASE</spring.version>
    	</properties>
    ...
    	<dependencies>
    ...		
    		<dependency>
    			<groupId>org.aspectj</groupId>
    			<artifactId>aspectjrt</artifactId>
    			<version>${aspectj.version}</version>
    		</dependency>
    		<dependency>
    			<groupId>org.aspectj</groupId>
    			<artifactId>aspectjweaver</artifactId>
    			<version>${aspectj.version}</version>
    		</dependency>
    		<!-- ROO dependencies -->
    		<dependency>
    			<groupId>org.springframework.roo</groupId>
    			<artifactId>org.springframework.roo.annotations</artifactId>
    			<version>${roo.version}</version>
    			<scope>provided</scope>
    		</dependency>
    		<!-- Spring dependencies -->
    		<dependency>
    			<groupId>org.springframework</groupId>
    			<artifactId>spring-core</artifactId>
    			<version>${spring.version}</version>
    			<exclusions>
    				<exclusion>
    					<groupId>commons-logging</groupId>
    					<artifactId>commons-logging</artifactId>
    				</exclusion>
    			</exclusions>
    		</dependency>
    		<dependency>
    			<groupId>org.springframework</groupId>
    			<artifactId>spring-test</artifactId>
    			<version>${spring.version}</version>
    			<scope>test</scope>
    		</dependency>
    		<dependency>
    			<groupId>org.springframework</groupId>
    			<artifactId>spring-context</artifactId>
    			<version>${spring.version}</version>
    		</dependency>
    		<dependency>
    			<groupId>org.springframework</groupId>
    			<artifactId>spring-aop</artifactId>
    			<version>${spring.version}</version>
    		</dependency>
    		<dependency>
    			<groupId>org.springframework</groupId>
    			<artifactId>spring-aspects</artifactId>
    			<version>${spring.version}</version>
    		</dependency>
    	</dependencies>
    	<build>
    		<plugins>
    			
    			<plugin>
    				<groupId>org.apache.maven.plugins</groupId>
    				<artifactId>maven-compiler-plugin</artifactId>
    				<version>2.3.2</version>
    				<configuration>
    					<source>${java.version}</source>
    					<target>${java.version}</target>
    					<encoding>${project.build.sourceEncoding}</encoding>
    				</configuration>
    			</plugin>
    			<plugin>
    				<groupId>org.codehaus.mojo</groupId>
    				<artifactId>aspectj-maven-plugin</artifactId>
    				<version>1.4</version>
    				<dependencies>
    					<dependency>
    						<groupId>org.aspectj</groupId>
    						<artifactId>aspectjrt</artifactId>
    						<version>${aspectj.version}</version>
    					</dependency>
    					<dependency>
    						<groupId>org.aspectj</groupId>
    						<artifactId>aspectjtools</artifactId>
    						<version>${aspectj.version}</version>
    					</dependency>
    				</dependencies>
    				<executions>
    					<execution>
    						<goals>
    							<goal>compile</goal>
    							<goal>test-compile</goal>
    						</goals>
    					</execution>
    				</executions>
    				<configuration>
    					<outxml>true</outxml>
    					<aspectLibraries>
    						<aspectLibrary>
    							<groupId>org.springframework</groupId>
    							<artifactId>spring-aspects</artifactId>
    						</aspectLibrary>
    					</aspectLibraries>
    					<source>${java.version}</source>
    					<target>${java.version}</target>
    					<complianceLevel>1.6</complianceLevel>
    <!-- 					<showWeaveInfo>true</showWeaveInfo> -->
    <!-- 					<verbose>true</verbose> -->
    				</configuration>
    			</plugin>
    						
    			<!-- IDE -->
    			<plugin>
    				<groupId>org.apache.maven.plugins</groupId>
    				<artifactId>maven-eclipse-plugin</artifactId>
    				<version>2.7</version>
    				<!-- Note 2.8 does not work with AspectJ aspect path -->
    				<configuration>
    					<downloadSources>true</downloadSources>
    					<downloadJavadocs>false</downloadJavadocs>
    					<wtpversion>2.0</wtpversion>
    					<additionalBuildcommands>
    						<buildCommand>
    							<name>org.eclipse.ajdt.core.ajbuilder</name>
    							<arguments>
    								<aspectPath>org.springframework.aspects</aspectPath>
    							</arguments>
    						</buildCommand>
    						<buildCommand>
    							<name>org.springframework.ide.eclipse.core.springbuilder</name>
    						</buildCommand>
    					</additionalBuildcommands>
    					<additionalProjectnatures>
    						<projectnature>org.eclipse.ajdt.ui.ajnature</projectnature>
    						<projectnature>com.springsource.sts.roo.core.nature</projectnature>
    						<projectnature>org.springframework.ide.eclipse.core.springnature</projectnature>
    					</additionalProjectnatures>
    				</configuration>
    			</plugin>
    		</plugins>
    	</build>
    </project>
    Why is there such a huge drop in performance with using AspectJ?

    Thanks in advance for any help.

  • #2
    UPDATE: According to https://jira.springsource.org/browse/ROO-1636 there are performance considerations with using @Configurable (at least in some cases). Indeed, refactoring the domain layer to not use @Configurable yielded the desired performance figures, at least when it comes to populating the domain objects with data. Persisting that data, however, still takes a lot more time than it should.

    Comment

    Working...
    X