diff options
author | acolyer <acolyer> | 2006-01-20 12:28:01 +0000 |
---|---|---|
committer | acolyer <acolyer> | 2006-01-20 12:28:01 +0000 |
commit | 17865f45b709f5b8adf86acff50dd5d05ea4a4f0 (patch) | |
tree | 206c74e8fb7aa6326fb8b3a30153cc03b41a6d5e | |
parent | 7a9a69e5c82ee9ee59f94cc68d69a3c25c36b5ff (diff) | |
download | aspectj-17865f45b709f5b8adf86acff50dd5d05ea4a4f0.tar.gz aspectj-17865f45b709f5b8adf86acff50dd5d05ea4a4f0.zip |
ant script for running profiling tests against aspectj with ajc source compile, binary weaving, load-time weaving, and AJDT simulation. Can configure target application and source of compiler (workspace or pre-built jars).
25 files changed, 767 insertions, 4 deletions
diff --git a/tests/profiling/.cvsignore b/tests/profiling/.cvsignore new file mode 100644 index 000000000..189c180cf --- /dev/null +++ b/tests/profiling/.cvsignore @@ -0,0 +1,4 @@ +results +gc.txt +java.hprof.txt +project.properties diff --git a/tests/profiling/aspects/readme.txt b/tests/profiling/aspects/readme.txt new file mode 100644 index 000000000..c7409545d --- /dev/null +++ b/tests/profiling/aspects/readme.txt @@ -0,0 +1,8 @@ +Some sample aspects that will by default be woven with the +target application. + +Designed to make sure that ajc has plenty of work to do!! + +Only the "simple-suite" has been defined so far, but you could +define other aspect suites to exercise different workloads, and +use them by setting the test.aspects.src.dir property diff --git a/tests/profiling/aspects/simple-suite/src/META-INF/aop.xml b/tests/profiling/aspects/simple-suite/src/META-INF/aop.xml new file mode 100644 index 000000000..6378d9301 --- /dev/null +++ b/tests/profiling/aspects/simple-suite/src/META-INF/aop.xml @@ -0,0 +1,5 @@ +<aspectj> + <aspects> + <aspect name="org.aspectj.profiling.WorkTheWeaver"/> + </aspects> +</aspectj>
\ No newline at end of file diff --git a/tests/profiling/aspects/simple-suite/src/org/aspectj/profiling/WorkTheWeaver.aj b/tests/profiling/aspects/simple-suite/src/org/aspectj/profiling/WorkTheWeaver.aj new file mode 100644 index 000000000..9321decee --- /dev/null +++ b/tests/profiling/aspects/simple-suite/src/org/aspectj/profiling/WorkTheWeaver.aj @@ -0,0 +1,21 @@ +package org.aspectj.profiling; + +public aspect WorkTheWeaver { + + before() : execution(* set*(..)) { + System.out.println("before setter..."); + } + + after() returning : execution(* set*(..)) { + System.out.println("after returning from setter..."); + } + + // using "call" on an interface type will cause us to chase + // all the way up the inheritance hierarchies of any type we + // call. + // it also means we have to crack open methods when weaving... + declare warning : call(* java.lang.Runnable+.*(..)) + : "call to a subtype of runnable"; + + +}
\ No newline at end of file diff --git a/tests/profiling/build.properties b/tests/profiling/build.properties new file mode 100644 index 000000000..2718ca584 --- /dev/null +++ b/tests/profiling/build.properties @@ -0,0 +1,98 @@ +# Version controlled properties for profiling ant script +# You can locally override properties defined here by placing +# them in a project.properties file in the same directory. +# +# Do not check your project.properties file into CVS! + +# directory containing aspectj libraries (aspectj[tools|weaver|rt].jar) +aspectj.lib.dir=../../aj-build/dist/tools/lib + +# root directory of your workspace containing the aspectj tree (if +# using head for profiling as opposed to a built version of aspectj) +aspectj.workspace.root=../.. + +# set this property to false in your project.properties to use the contents of your workspace +# for compilation, as opposed to the jars in aspectj.lib.dir +use.aspectjtools.jar=true + +# the iajc task that ships with 1.5.0 or any prior release does +# not support the need <jvmarg> nested attribute that this +# profiling script needs. To profile AspectJ versions < 1.5.1, +# use the local copy of AjcTask in the "classes" folder by +# defining the following property +use.local.iajc.task.class=true + +# directory in which results will be placed +results.dir=results + +# source and target levels for compilation +source.level=1.5 +target.level=1.5 + +# the maximum memory to make available for the compilation/weaving +ajc.maxmem=768m + +# the name of the file containing the path definitions needed to compile +# a particular target application as the subject of the profiling +# we profile the compilation and weaving of spring 1.2.6 by default. +target.application.definitions.file=./spring-1.2.6.xml + +# target application name, used as the subdirectory under results to store +# profiling results +target.application.name=spring-1.2.6 + +# source root directory for the aspects you want to compile and weave alongside +# the target application (unless it contains sufficient aspects on its own...) +test.aspects.src.dir=./aspects/simple-suite/src + +# installation dir of a spring-1.2.6 distribution. you will need to set this +# in project.properties unless you point the target.application.definitions.file +# to compile a different target application altogether. +spring.install.dir=must-set-spring.install.dir-property-in-project.properties + +# for binary and loadtime weaving, the location of the jar file that will be +# woven into +weave.injar=${spring.install.dir}/dist/spring.jar + +# location of aop.xml file to be included when load-time weaving +# use this to control the set of types exposed to the weaver so as to +# match the set of types woven in the other modes for fair comparisons +# across weave times +ltw.aop.xml=./ltw-app/META-INF/aop.xml + +# args to pass to vm for hprof run +# +# hprof usage: java -agentlib:hprof=[help]|[<option>=<value>, ...] +# +# Option Name and Value Description Default +# --------------------- ----------- ------- +# heap=dump|sites|all heap profiling all +# cpu=samples|times|old CPU usage off +# monitor=y|n monitor contention n +# format=a|b text(txt) or binary output a +# file=<file> write data to file java.hprof[.txt] +# net=<host>:<port> send data over a socket off +# depth=<size> stack trace depth 4 +# interval=<ms> sample interval in ms 10 +# cutoff=<value> output cutoff point 0.0001 +# lineno=y|n line number in traces? y +# thread=y|n thread in traces? n +# doe=y|n dump on exit? y +# msa=y|n Solaris micro state accounting n +# force=y|n force output to <file> y +# verbose=y|n print messages about dumps y +# see http://java.sun.com/developer/technicalArticles/Programming/HPROF.html +hprof.args=-agentlib:hprof=heap=sites,cpu=samples +# for full details on object allocation and reachability use heap=all instead +# (v. large files) +# for full timing info use cpu=times (much slower) +# for Java 1.4 and below use the following style instead +# hprof.args=-Xrunhprof:cpu=times + +# args to pass to vm for gc run +# after a run this file will be copied into results/${target.application.name}/gt.<date-time>.txt +# you can analyze it with JTune (http://www.hp.com/products1/unix/java/java2/hpjtune/index.html) +# Start JTune with java -jar HPTune.jar +gc.args=-Xloggc:gc.txt + + diff --git a/tests/profiling/build.xml b/tests/profiling/build.xml new file mode 100644 index 000000000..67ce475a1 --- /dev/null +++ b/tests/profiling/build.xml @@ -0,0 +1,418 @@ +<?xml version="1.0"?> + +<!-- + Copyright 2006 contributors. + + All rights reserved. + This program and the accompanying materials are made available + under the terms of the Eclipse Public License v1.0 + which accompanies this distribution and is available at + http://eclipse.org/legal/epl-v10.html + + Contributors: Adrian Colyer +--> + +<project name="aspectj-profiling" default="usage"> + + <!-- project.properties contains your local settings, not checked into CVS --> + <property file="project.properties"/> + + <!-- default property settings, version controlled --> + <property file="build.properties"/> + + <!-- pull in the ant file defining the paths etc. for the target application --> + <import file="${target.application.definitions.file}"/> + + <!-- list of useful targets... --> + <target name="usage"> + <echo message="ant build script for profiling AspectJ compiler"/> + <echo message="useful targets are:"/> + <echo message=" gc.suite : runs basic timing and gc for source, binary, ltw, and ajdt compiles"/> + <echo message=" full.profile.suite : runs full profiling for source, binary, ltw, and ajdt compiles"/> + <echo message=" source.compile : compiles from source (and weaves) with full profiling"/> + <echo message=" source.compile.gc : compiles from source (and weaves) with basic timing and gc"/> + <echo message=" binary.weave : binary weaving from injars and aspectpath with full profiling"/> + <echo message=" binary.weave.gc : binary weaving from injars and aspectpath with basic timing and gc"/> + <echo message=" loadtime.weave : load-time weaving with full profiling"/> + <echo message=" loadtime.weave.gc : load-time weaving with basic timing and gc"/> + <echo message=" ajdt.compile : source compile simulating ajdt usage of compiler with full profiling"/> + <echo message=" ajdt.compile.gc : source compile simulating ajdt usage of compiler with basic timing and gc"/> + <echo message=" clean : remove all output etc. and prepare for fresh run"/> + <echo message="results are placed in ${results.dir} for analysis with HAT, PerfAnal etc."/> + <echo message="customise behaviour using local project.properties (see build.properties"/> + <echo message="for available customisations)"/> + </target> + + <!-- handy suites --> + <target name="gc.suite" depends="source.compile.gc,binary.weave.gc,loadtime.weave.gc,ajdt.compile.gc"/> + <target name="full.profile.suite" depends="source.compile,binary.weave,loadtime.weave,ajdt.compile"/> + + <!-- + how to obtain the aspectj compiler - if the use.aspectjtools.jar property + is set to true, will use the version of aspectjtools.jar in + aspectj.lib.dir. If use.aspectjtools.jar property is false, will use + the bin directories from the projects in your aspectj.workspace.root. + --> + + <condition property="ajtools.jar"> + <istrue value="${use.aspectjtools.jar}"/> + </condition> + + <condition property="iajc.local"> + <istrue value="${use.local.iajc.task.class}"/> + </condition> + + <path id="aspectj.compiler.path"> + <dirset dir="."> + <include name="classes" if="iajc.local"/> + </dirset> + <fileset dir="${aspectj.lib.dir}"> + <include name="aspectjtools.jar" if="ajtools.jar"/> + </fileset> + <dirset dir="${aspectj.workspace.root}"> + <include name="*/bin" unless="ajtools.jar"/> + </dirset> + <fileset dir="${aspectj.workspace.root}"> + <include name="org.eclipse.jdt.core/jdtcore-for-aspectj.jar" unless="ajtools.jar"/> + <include name="lib/bcel/bcel.jar" unless="ajtools.jar"/> + </fileset> + </path> + + <path id="ajde.launch.path"> + <dirset dir="${aspectj.workspace.root}"> + <include name="test*/bin"/> + </dirset> + </path> + + <!-- define the iajc task --> + <taskdef resource="org/aspectj/tools/ant/taskdefs/aspectjTaskdefs.properties"> + <classpath> + <path refid="aspectj.compiler.path"/> + </classpath> + </taskdef> + + <!-- some simple checking to give status messages about the config we will run with --> + <target name="config-check" depends="check.ajtools.jar,check.workspace,check.iajc.local,check.iajc.ajtools"/> + <target name="check.ajtools.jar" if="ajtools.jar"> + <echo message="using aspectjtools.jar from ${aspectj.lib.dir}"/> + </target> + <target name="check.workspace" unless="ajtools.jar"> + <echo message="using AspectJ from workspace at ${aspectj.workspace.root}"/> + </target> + <target name="check.iajc.local" if="iajc.local"> + <echo message="using patched version of iajc supporting jvmargs"/> + </target> + <target name="check.iajc.ajtools" unless="iajc.local"> + <echo message="using version of iajc from aspectjtools.jar"/> + </target> + + <!-- init and clean... --> + + <target name="init"> + <mkdir dir="${results.dir}"/> + <mkdir dir="${results.dir}/${target.application.name}"/> + <mkdir dir="${results.dir}/ltw-app"/> + <mkdir dir="${results.dir}/ltw-app/META-INF"/> + </target> + + <target name="clean" depends="init"> + <delete dir="${results.dir}"/> + </target> + + <!-- classpath to use for all targets --> + + <path id="iajc.class.path"> + <path refid="build.class.path"/> + <pathelement location="${aspectj.lib.dir}/aspectjrt.jar"/> + <path refid="aspectj.compiler.path"/> + </path> + + + <!-- source compilation (ajc style) with various profiling --> + + <target name="source.compile" depends="init,config-check"> + <iajc destdir="${results.dir}/${target.application.name}/classes" + fork="true" maxmem="${ajc.maxmem}" + debug="on" + source="${source.level}" target="${target.level}" + sourcerootsref="source.roots" + time="true" + forkclasspathref="iajc.class.path"> + <jvmarg value="${hprof.args}"/> + <jvmarg value="${gc.args}"/> + </iajc> + + <tstamp> + <format property="ajc.runtime" pattern="yyyy-MM-dd'T'HHmmss"/> + </tstamp> + <property name="ajc.hprof.out" value="${results.dir}/${target.application.name}/ajc.java.hprof.${ajc.runtime}.txt"/> + <property name="ajc.gc.out" value="${results.dir}/${target.application.name}/ajc.gc.${ajc.runtime}.txt"/> + <move file="java.hprof.txt" tofile="${ajc.hprof.out}"/> + <move file="gc.txt" tofile="${ajc.gc.out}"/> + <echo message="hprof data written to ${ajc.hprof.out}"/> + <echo message="gc data written to ${ajc.gc.out}"/> + <echo message="analyse with e.g. HATS and JTune"/> + </target> + + <target name="source.compile.gc" depends="init,config-check"> + <tstamp> + <format property="ajc.starttime" pattern="HH:mm:ss"/> + </tstamp> + <echo message="ajc compile started at: ${ajc.starttime}"/> + + <iajc destdir="${results.dir}/${target.application.name}/classes" + fork="true" maxmem="${ajc.maxmem}" + debug="on" + source="${source.level}" target="${target.level}" + sourcerootsref="source.roots" + forkclasspathref="iajc.class.path" + time="true"> + <jvmarg value="${gc.args}"/> + </iajc> + + <tstamp> + <format property="ajc.endtime" pattern="HH:mm:ss"/> + </tstamp> + <echo message="ajc compile ended at: ${ajc.endtime} (started at ${ajc.starttime})"/> + <tstamp> + <format property="ajc.gc.runtime" pattern="yyyy-MM-dd'T'HHmmss"/> + </tstamp> + <property name="ajc.gc.only.out" value="${results.dir}/${target.application.name}/ajc.gc.${ajc.gc.runtime}.txt"/> + <move file="gc.txt" tofile="${ajc.gc.only.out}"/> + <echo message="gc data written to ${ajc.gc.only.out}"/> + <echo message="analyze with JTune"/> + </target> + + <!-- binary weaving with various profiling options --> + + <!-- build an aspect library to use for binary weaving, so that we + profile weaving only... --> + <target name="aspectlib" depends="init"> + <iajc outjar="${results.dir}/aspectlib.jar" + debug="on" + source="${source.level}" + target="${target.level}" + sourceroots="${test.aspects.src.dir}" + sourceRootCopyFilter="**/*.java,**/*.aj,**/CVS/*" + classpathref="iajc.class.path"> + </iajc> + </target> + + <target name="binary.weave" depends="init,aspectlib"> + <iajc outjar="${results.dir}/woven.jar" + debug="on" + source="${source.level}" + target="${target.level}" + fork="true" + forkclasspathref="iajc.class.path" + maxmem="${ajc.maxmem}"> + <inpath> + <pathelement location="${weave.injar}"/> + </inpath> + <aspectpath> + <pathelement location="${results.dir}/aspectlib.jar"/> + </aspectpath> + <jvmarg value="${hprof.args}"/> + <jvmarg value="${gc.args}"/> + </iajc> + + <tstamp> + <format property="bw.runtime" pattern="yyyy-MM-dd'T'HHmmss"/> + </tstamp> + <property name="bw.hprof.out" value="${results.dir}/${target.application.name}/weave.java.hprof.${bw.runtime}.txt"/> + <property name="bw.gc.out" value="${results.dir}/${target.application.name}/weave.gc.${bw.runtime}.txt"/> + <move file="java.hprof.txt" tofile="${bw.hprof.out}"/> + <move file="gc.txt" tofile="${bw.gc.out}"/> + <echo message="hprof data written to ${bw.hprof.out}"/> + <echo message="gc data written to ${bw.gc.out}"/> + <echo message="analyse with e.g. HATS and JTune"/> + </target> + + <target name="binary.weave.gc" depends="init,aspectlib"> + <tstamp> + <format property="bw.starttime" pattern="HH:mm:ss"/> + </tstamp> + <echo message="weave started at: ${bw.starttime}"/> + + <iajc outjar="${results.dir}/woven.jar" + debug="on" + source="${source.level}" + target="${target.level}" + fork="true" + forkclasspathref="iajc.class.path" + maxmem="${ajc.maxmem}"> + <inpath> + <pathelement location="${weave.injar}"/> + </inpath> + <aspectpath> + <pathelement location="${results.dir}/aspectlib.jar"/> + </aspectpath> + <jvmarg value="${gc.args}"/> + </iajc> + + <tstamp> + <format property="bw.endtime" pattern="HH:mm:ss"/> + </tstamp> + <echo message="weave ended at: ${bw.endtime} (started at ${bw.starttime})"/> + <tstamp> + <format property="bw.gc.only.runtime" pattern="yyyy-MM-dd'T'HHmmss"/> + </tstamp> + <property name="bw.gc.only.out" value="${results.dir}/${target.application.name}/weave.gc.${bw.gc.only.runtime}.txt"/> + <move file="gc.txt" tofile="${bw.gc.only.out}"/> + <echo message="gc data written to ${bw.gc.only.out}"/> + <echo message="analyze with JTune"/> + </target> + + <!-- loadtime weaving with various profiling options --> + + <target name="ltw-app" depends="init" + description="builds an application that we can run with ltw. The app does + Class.forName(..) on every type within the jar file passed to + it as an argument, thus forcing all those types (and types they + reference) to be woven)"> + + <javac srcdir="ltw-app/src" destdir="${results.dir}/ltw-app"> + </javac> + <copy file="${ltw.aop.xml}" todir="${results.dir}/ltw-app/META-INF"/> + </target> + + <target name="check-using-jars" unless="ajtools.jar"> + <echo message="WARNING: cannot run load-time weaving from workspace dirs"/> + <echo message="use.aspectjtools.jar setting will be ignored and the jar"/> + <echo message="${aspectj.lib.dir}/aspectjweaver.jar will be used for LTW instead"/> + </target> + + <target name="loadtime.weave" depends="check-using-jars,aspectlib,ltw-app"> + <java classname="org.aspectj.profiling.LTWApp" + fork="true" + maxmemory="${ajc.maxmem}"> + <arg value="${weave.injar}"/> + <jvmarg value="${gc.args}"/> + <jvmarg value="${hprof.args}"/> + <jvmarg value="-javaagent:${aspectj.lib.dir}/aspectjweaver.jar"/> + <classpath> + <pathelement location="${results.dir}/ltw-app"/> + <pathelement location="${results.dir}/aspectlib.jar"/> + <pathelement location="${weave.injar}"/> + <path refid="iajc.class.path"/> + </classpath> + </java> + <tstamp> + <format property="ltw.runtime" pattern="yyyy-MM-dd'T'HHmmss"/> + </tstamp> + <property name="ltw.hprof.out" value="${results.dir}/${target.application.name}/ltw.java.hprof.${ltw.runtime}.txt"/> + <property name="ltw.gc.out" value="${results.dir}/${target.application.name}/ltw.gc.${ltw.runtime}.txt"/> + <move file="java.hprof.txt" tofile="${ltw.hprof.out}"/> + <move file="gc.txt" tofile="${ltw.gc.out}"/> + <echo message="hprof data written to ${ltw.hprof.out}"/> + <echo message="gc data written to ${ltw.gc.out}"/> + <echo message="analyse with e.g. HATS and JTune"/> + </target> + + <target name="loadtime.weave.gc" depends="check-using-jars,aspectlib,ltw-app"> + <tstamp> + <format property="ltw.starttime" pattern="HH:mm:ss"/> + </tstamp> + <echo message="ltw started at: ${ltw.starttime}"/> + + <java classname="org.aspectj.profiling.LTWApp" + fork="true" + maxmemory="${ajc.maxmem}"> + <arg value="${weave.injar}"/> + <jvmarg value="${gc.args}"/> + <jvmarg value="-javaagent:${aspectj.lib.dir}/aspectjweaver.jar"/> + <classpath> + <pathelement location="${results.dir}/ltw-app"/> + <pathelement location="${results.dir}/aspectlib.jar"/> + <pathelement location="${weave.injar}"/> + <path refid="iajc.class.path"/> + </classpath> + </java> + + <tstamp> + <format property="ltw.endtime" pattern="HH:mm:ss"/> + </tstamp> + <echo message="ltw ended at: ${ltw.endtime} (started at ${ltw.starttime})"/> + <tstamp> + <format property="ltw.gc.only.runtime" pattern="yyyy-MM-dd'T'HHmmss"/> + </tstamp> + <property name="ltw.gc.only.out" value="${results.dir}/${target.application.name}/ltw.gc.${ltw.gc.only.runtime}.txt"/> + <move file="gc.txt" tofile="${ltw.gc.only.out}"/> + <echo message="gc data written to ${ltw.gc.only.out}"/> + <echo message="analyze with JTune"/> + </target> + + <!-- "AJDT-like" compiles with various profiling options --> + + <target name="prepare-project" depends="init"> + <delete dir="${results.dir}/ajdt-workspace-root"/> + <mkdir dir="${results.dir}/ajdt-workspace-root"/> + <mkdir dir="${results.dir}/ajdt-workspace-root/${target.application.name}"/> + <mkdir dir="${results.dir}/ajdt-workspace-root/${target.application.name}/base"/> + <antcall target="copy.source.files"> + <param name="todir" value="${results.dir}/ajdt-workspace-root/${target.application.name}/base"/> + </antcall> + </target> + + <target name="ajdt.compile" depends="prepare-project"> + + <java classname="org.aspectj.systemtest.incremental.tools.AjdeInteractionTestbedLauncher" + fork="true" + maxmemory="${ajc.maxmem}"> + <arg value="${results.dir}/ajdt-workspace-root"/> + <arg value="${target.application.name}"/> + <jvmarg value="${gc.args}"/> + <jvmarg value="${hprof.args}"/> + <classpath> + <path refid="iajc.class.path"/> + <path refid="ajde.launch.path"/> + <pathelement location="${aspectj.lib.dir}/aspectjrt.jar"/> + </classpath> + </java> + + <tstamp> + <format property="ajdt.runtime" pattern="yyyy-MM-dd'T'HHmmss"/> + </tstamp> + <property name="ajdt.hprof.out" value="${results.dir}/${target.application.name}/ajdt.java.hprof.${ajdt.runtime}.txt"/> + <property name="ajdt.gc.out" value="${results.dir}/${target.application.name}/ajdt.gc.${ajdt.runtime}.txt"/> + <move file="java.hprof.txt" tofile="${ajdt.hprof.out}"/> + <move file="gc.txt" tofile="${ajdt.gc.out}"/> + <echo message="hprof data written to ${ajdt.hprof.out}"/> + <echo message="gc data written to ${ajdt.gc.out}"/> + <echo message="analyse with e.g. HATS and JTune"/> + + </target> + + <target name="ajdt.compile.gc" depends="prepare-project"> + <tstamp> + <format property="ajdt.starttime" pattern="HH:mm:ss"/> + </tstamp> + <echo message="AJDT started at: ${ajdt.starttime}"/> + + <java classname="org.aspectj.systemtest.incremental.tools.AjdeInteractionTestbedLauncher" + fork="true" + maxmemory="${ajc.maxmem}"> + <arg value="${results.dir}/ajdt-workspace-root"/> + <arg value="${target.application.name}"/> + <jvmarg value="${gc.args}"/> + <classpath> + <path refid="iajc.class.path"/> + <path refid="ajde.launch.path"/> + <pathelement location="${aspectj.lib.dir}/aspectjrt.jar"/> + </classpath> + </java> + + <tstamp> + <format property="ajdt.endtime" pattern="HH:mm:ss"/> + </tstamp> + <echo message="AJDT ended at: ${ajdt.endtime} (started at ${ajdt.starttime})"/> + <tstamp> + <format property="ajdt.gc.only.runtime" pattern="yyyy-MM-dd'T'HHmmss"/> + </tstamp> + <property name="ajdt.gc.only.out" value="${results.dir}/${target.application.name}/ajdt.gc.${ajdt.gc.only.runtime}.txt"/> + <move file="gc.txt" tofile="${ajdt.gc.only.out}"/> + <echo message="gc data written to ${ajdt.gc.only.out}"/> + <echo message="analyze with JTune"/> + </target> + +</project>
\ No newline at end of file diff --git a/tests/profiling/classes/org/aspectj/tools/ant/taskdefs/AjcTask$1$Args.class b/tests/profiling/classes/org/aspectj/tools/ant/taskdefs/AjcTask$1$Args.class Binary files differnew file mode 100644 index 000000000..9d20df98b --- /dev/null +++ b/tests/profiling/classes/org/aspectj/tools/ant/taskdefs/AjcTask$1$Args.class diff --git a/tests/profiling/classes/org/aspectj/tools/ant/taskdefs/AjcTask$1.class b/tests/profiling/classes/org/aspectj/tools/ant/taskdefs/AjcTask$1.class Binary files differnew file mode 100644 index 000000000..7a5eb7520 --- /dev/null +++ b/tests/profiling/classes/org/aspectj/tools/ant/taskdefs/AjcTask$1.class diff --git a/tests/profiling/classes/org/aspectj/tools/ant/taskdefs/AjcTask$2.class b/tests/profiling/classes/org/aspectj/tools/ant/taskdefs/AjcTask$2.class Binary files differnew file mode 100644 index 000000000..ad3a1e453 --- /dev/null +++ b/tests/profiling/classes/org/aspectj/tools/ant/taskdefs/AjcTask$2.class diff --git a/tests/profiling/classes/org/aspectj/tools/ant/taskdefs/AjcTask$AntMessageHandler.class b/tests/profiling/classes/org/aspectj/tools/ant/taskdefs/AjcTask$AntMessageHandler.class Binary files differnew file mode 100644 index 000000000..9528a5f2c --- /dev/null +++ b/tests/profiling/classes/org/aspectj/tools/ant/taskdefs/AjcTask$AntMessageHandler.class diff --git a/tests/profiling/classes/org/aspectj/tools/ant/taskdefs/AjcTask$GuardedCommand.class b/tests/profiling/classes/org/aspectj/tools/ant/taskdefs/AjcTask$GuardedCommand.class Binary files differnew file mode 100644 index 000000000..b0f916d5c --- /dev/null +++ b/tests/profiling/classes/org/aspectj/tools/ant/taskdefs/AjcTask$GuardedCommand.class diff --git a/tests/profiling/classes/org/aspectj/tools/ant/taskdefs/AjcTask.class b/tests/profiling/classes/org/aspectj/tools/ant/taskdefs/AjcTask.class Binary files differnew file mode 100644 index 000000000..21d62cd63 --- /dev/null +++ b/tests/profiling/classes/org/aspectj/tools/ant/taskdefs/AjcTask.class diff --git a/tests/profiling/classes/org/aspectj/tools/ant/taskdefs/AjcTaskTest$1.class b/tests/profiling/classes/org/aspectj/tools/ant/taskdefs/AjcTaskTest$1.class Binary files differnew file mode 100644 index 000000000..8bd8fbb87 --- /dev/null +++ b/tests/profiling/classes/org/aspectj/tools/ant/taskdefs/AjcTaskTest$1.class diff --git a/tests/profiling/classes/org/aspectj/tools/ant/taskdefs/AjcTaskTest$Holder.class b/tests/profiling/classes/org/aspectj/tools/ant/taskdefs/AjcTaskTest$Holder.class Binary files differnew file mode 100644 index 000000000..cbe75befc --- /dev/null +++ b/tests/profiling/classes/org/aspectj/tools/ant/taskdefs/AjcTaskTest$Holder.class diff --git a/tests/profiling/classes/org/aspectj/tools/ant/taskdefs/AjcTaskTest$InfoHolder.class b/tests/profiling/classes/org/aspectj/tools/ant/taskdefs/AjcTaskTest$InfoHolder.class Binary files differnew file mode 100644 index 000000000..2c97a56e6 --- /dev/null +++ b/tests/profiling/classes/org/aspectj/tools/ant/taskdefs/AjcTaskTest$InfoHolder.class diff --git a/tests/profiling/classes/org/aspectj/tools/ant/taskdefs/AjcTaskTest$MessageHolderChecker.class b/tests/profiling/classes/org/aspectj/tools/ant/taskdefs/AjcTaskTest$MessageHolderChecker.class Binary files differnew file mode 100644 index 000000000..db9a389b9 --- /dev/null +++ b/tests/profiling/classes/org/aspectj/tools/ant/taskdefs/AjcTaskTest$MessageHolderChecker.class diff --git a/tests/profiling/classes/org/aspectj/tools/ant/taskdefs/AjcTaskTest.class b/tests/profiling/classes/org/aspectj/tools/ant/taskdefs/AjcTaskTest.class Binary files differnew file mode 100644 index 000000000..fb012d2da --- /dev/null +++ b/tests/profiling/classes/org/aspectj/tools/ant/taskdefs/AjcTaskTest.class diff --git a/tests/profiling/classes/readme.txt b/tests/profiling/classes/readme.txt new file mode 100644 index 000000000..b4e8b35e7 --- /dev/null +++ b/tests/profiling/classes/readme.txt @@ -0,0 +1,6 @@ +This folder contains a copy of AjcTask from the AspectJ 1.5.1 tree. +It is put on the classpath ahead of aspectjtools.jar when the +property use.local.iajc.task.class is set to true (default = true). +You need this if you want to profile released versions of aspectj +prior to 1.5.1 in order for the <jvmarg> property that the profiler +needs to be supported.
\ No newline at end of file diff --git a/tests/profiling/ltw-app/META-INF/aop.xml b/tests/profiling/ltw-app/META-INF/aop.xml new file mode 100644 index 000000000..782ed75ca --- /dev/null +++ b/tests/profiling/ltw-app/META-INF/aop.xml @@ -0,0 +1,5 @@ +<aspectj> + <weaver> + <include within="org.springframework..*"/> + </weaver> +</aspectj>
\ No newline at end of file diff --git a/tests/profiling/ltw-app/src/org/aspectj/profiling/LTWApp.java b/tests/profiling/ltw-app/src/org/aspectj/profiling/LTWApp.java new file mode 100644 index 000000000..a247fb10b --- /dev/null +++ b/tests/profiling/ltw-app/src/org/aspectj/profiling/LTWApp.java @@ -0,0 +1,74 @@ +/* ******************************************************************* + * Copyright (c) 2006 Contributors. + * All rights reserved. + * This program and the accompanying materials are made available + * under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution and is available at + * http://eclipse.org/legal/epl-v10.html + * + * Contributors: + * Adrian Colyer Initial implementation + * ******************************************************************/ +package org.aspectj.profiling; + +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; +import java.util.zip.ZipEntry; +import java.util.zip.ZipInputStream; + +/** + * Application that takes a single argument containing the name of a + * jar file, and performs Class.forName on every class within it. + */ +public class LTWApp { + + private File inJar; + private int numLoaded = 0; + + public static void main(String[] args) throws IOException { + if (args.length != 1) { + throw new IllegalArgumentException("Expecting a single jar file argument"); + } + new LTWApp(args[0]).run(); + } + + public LTWApp(String jarFileName) { + inJar = new File(jarFileName); + if (!inJar.exists() || !inJar.canRead()) { + throw new IllegalArgumentException("File '" + jarFileName + + "' does not exist or cannot be read"); + } + } + + public void run() throws IOException { + ZipInputStream inStream = new ZipInputStream(new FileInputStream(inJar)); + long startTime = System.currentTimeMillis(); + while (true) { + ZipEntry entry = inStream.getNextEntry(); + if (entry == null) break; + + if (entry.isDirectory() || !entry.getName().endsWith(".class")) { + continue; + } + + loadClass(entry.getName()); + } + long endTime = System.currentTimeMillis(); + System.out.println("Loaded " + numLoaded + " classes in " + (endTime - startTime) + " milliseconds"); + } + + private void loadClass(String classFileName) { + String className = classFileName.substring(0,(classFileName.length() - ".class".length())); + className = className.replace('/','.'); + try { + Class c = Class.forName(className); + } + catch(ClassNotFoundException ex) { + throw new IllegalStateException("Unable to load class defined in input jar file, check that jar is also on the classpath!"); + } + numLoaded++; + } +}
\ No newline at end of file diff --git a/tests/profiling/readme.txt b/tests/profiling/readme.txt new file mode 100644 index 000000000..0aa179285 --- /dev/null +++ b/tests/profiling/readme.txt @@ -0,0 +1,8 @@ +This folder contains an ant build script and supporting resources +that can be used for profiling the aspectj compiler and getting +information about memory usage and compilation time. + +"ant usage" will display usage information. + +Reports of historical interest (for tracking improvements across releases +for example) are kept in the reference-data sub-folder. diff --git a/tests/profiling/spring-1.2.6.xml b/tests/profiling/spring-1.2.6.xml new file mode 100644 index 000000000..868ae4287 --- /dev/null +++ b/tests/profiling/spring-1.2.6.xml @@ -0,0 +1,62 @@ +<?xml version="1.0"?> + +<!-- + Copyright 2006 contributors. + + All rights reserved. + This program and the accompanying materials are made available + under the terms of the Eclipse Public License v1.0 + which accompanies this distribution and is available at + http://eclipse.org/legal/epl-v10.html + + Contributors: Adrian Colyer +--> + +<project name="spring-1.2.6" default="spring-1.2.6-usage"> + + <!-- imported by master build.xml when using the springframework 1.2.6 + source tree as the basis for profiling the compiler --> + + <target name="spring-1.2.6-usage"> + <echo message="this file contains only path definitions"/> + <echo message="these are used to customize the target application used by"/> + <echo message="the profiling tests. Set the target.application.definitions.file"/> + <echo message="property to point to your own replacement of this file to"/> + <echo message="profile compilation of an alternate project"/> + </target> + + <!-- any target.application.definitions.file must define the following paths: + * source.roots (used for from source and ajdt compilation tests) + * build.class.path (the class path needed to build the application) + it must also define the copy.source.files target needed by the ajdt build + --> + + <!-- the source roots used for compilation. --> + <path id="source.roots"> + <pathelement location="${spring.install.dir}/src"/> + <pathelement location="${spring.install.dir}/tiger/src"/> + <pathelement location="${test.aspects.src.dir}"/> + </path> + + <!-- the classpath needed for compilation --> + <path id="build.class.path"> + <fileset dir="${spring.install.dir}"> + <include name="**/*.jar"/> + <exclude name="aspectj/*.jar"/> + </fileset> + </path> + + <!-- the source files used for AJDT project-based compilation --> + <target name="copy.source.files" depends="init"> + <echo message="copying source files to ${todir}"/> + <copy todir="${todir}"> + <fileset dir="${spring.install.dir}/src" + includes="**/*.java,**/*.aj"/> + <fileset dir="${spring.install.dir}/tiger/src" + includes="**/*.java,**/*.aj"/> + <fileset dir="${test.aspects.src.dir}" + includes="**/*.java,**/*.aj"/> + </copy> + </target> + +</project>
\ No newline at end of file diff --git a/tests/src/org/aspectj/systemtest/incremental/tools/AjdeInteractionTestbed.java b/tests/src/org/aspectj/systemtest/incremental/tools/AjdeInteractionTestbed.java index 9e864b089..36a7c2c1d 100644 --- a/tests/src/org/aspectj/systemtest/incremental/tools/AjdeInteractionTestbed.java +++ b/tests/src/org/aspectj/systemtest/incremental/tools/AjdeInteractionTestbed.java @@ -53,7 +53,7 @@ public class AjdeInteractionTestbed extends TestCase { public static boolean VERBOSE = false; // do you want the gory details? - public final static String testdataSrcDir = "../tests/multiIncremental"; + public static String testdataSrcDir = "../tests/multiIncremental"; protected static File sandboxDir; private static final String SANDBOX_NAME = "ajcSandbox"; @@ -365,6 +365,7 @@ public class AjdeInteractionTestbed extends TestCase { } private String projectName = null; + private String classPath = ""; public static void setActiveProject(String n) { _instance.projectName = n; @@ -383,6 +384,10 @@ public class AjdeInteractionTestbed extends TestCase { } } + public void setClasspath(String path) { + this.classPath = path; + } + // interface impl below // DOESSOMETHING @@ -429,7 +434,8 @@ public class AjdeInteractionTestbed extends TestCase { String cp = new File(testdataSrcDir) + File.pathSeparator + System.getProperty("sun.boot.class.path") + - File.pathSeparator + "../runtime/bin" + + File.pathSeparator + "../runtime/bin" + + File.pathSeparator + this.classPath + File.pathSeparator + System.getProperty("aspectjrt.path") + File.pathSeparator + "../lib/junit/junit.jar" + File.pathSeparator+".."+File.separator+"lib" + File.separator+"test"+File.separator+"aspectjrt.jar"; diff --git a/tests/src/org/aspectj/systemtest/incremental/tools/AjdeInteractionTestbedLauncher.java b/tests/src/org/aspectj/systemtest/incremental/tools/AjdeInteractionTestbedLauncher.java new file mode 100644 index 000000000..019b63023 --- /dev/null +++ b/tests/src/org/aspectj/systemtest/incremental/tools/AjdeInteractionTestbedLauncher.java @@ -0,0 +1,48 @@ +/* ******************************************************************* + * Copyright (c) 2006 Contributors. + * All rights reserved. + * This program and the accompanying materials are made available + * under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution and is available at + * http://eclipse.org/legal/epl-v10.html + * + * Contributors: + * Adrian Colyer Initial implementation + * ******************************************************************/ +package org.aspectj.systemtest.incremental.tools; + + +/** + * command-line launcher for Ajde-like aspectj runs for use with + * profiling tools. + */ +public class AjdeInteractionTestbedLauncher extends + MultiProjectIncrementalTests { + + /** + * usage: AjdeInteractionTestbedLauncher srcDir projectName + * @param args workspace_root_dir project_name + */ + public static void main(String[] args) throws Exception { + //AjdeInteractionTestbed.VERBOSE = true; + //MultiProjectIncrementalTests.VERBOSE = true; + AjdeInteractionTestbedLauncher.testdataSrcDir = args[0]; + AjdeInteractionTestbedLauncher launcher = new AjdeInteractionTestbedLauncher(); + launcher.setUp(); + launcher.buildProject(args[1]); + launcher.printBuildReport(); + launcher.tearDown(); + } + + public AjdeInteractionTestbedLauncher() { + String classPath = System.getProperty("java.class.path"); + ((MyProjectPropertiesAdapter)MyProjectPropertiesAdapter.getInstance()).setClasspath(classPath); + } + + private void buildProject(String projectName) { + initialiseProject(projectName); + build(projectName); + } + + +} diff --git a/tests/src/org/aspectj/systemtest/incremental/tools/MultiProjectIncrementalTests.java b/tests/src/org/aspectj/systemtest/incremental/tools/MultiProjectIncrementalTests.java index 4ae317a69..ca4dc81b0 100644 --- a/tests/src/org/aspectj/systemtest/incremental/tools/MultiProjectIncrementalTests.java +++ b/tests/src/org/aspectj/systemtest/incremental/tools/MultiProjectIncrementalTests.java @@ -45,7 +45,7 @@ import org.aspectj.testing.util.FileUtil; */ public class MultiProjectIncrementalTests extends AjdeInteractionTestbed { - private static boolean VERBOSE = false; + public static boolean VERBOSE = false; protected void setUp() throws Exception { super.setUp(); @@ -581,7 +581,7 @@ public class MultiProjectIncrementalTests extends AjdeInteractionTestbed { * Fill in the working directory with the project base files, * from the 'base' folder. */ - private void initialiseProject(String p) { + protected void initialiseProject(String p) { File projectSrc=new File(testdataSrcDir+File.separatorChar+p+File.separatorChar+"base"); File destination=new File(getWorkingDir(),p); if (!destination.exists()) {destination.mkdir();} |