Bug 268827 - incremental build issues
Summary: incremental build issues
Status: RESOLVED FIXED
Alias: None
Product: AspectJ
Classification: Tools
Component: Compiler (show other bugs)
Version: DEVELOPMENT   Edit
Hardware: PC Windows Vista
: P2 critical (vote)
Target Milestone: 1.6.4   Edit
Assignee: aspectj inbox CLA
QA Contact:
URL:
Whiteboard:
Keywords:
: 249212 (view as bug list)
Depends on: 269435 269555 269604
Blocks:
  Show dependency tree
 
Reported: 2009-03-16 11:53 EDT by Andrew Clement CLA
Modified: 2009-04-01 06:48 EDT (History)
3 users (show)

See Also:


Attachments
AJDT Event trace for AJDT 1.6.3 (43.86 KB, application/octet-stream)
2009-03-16 12:11 EDT, Andrew Eisenberg CLA
no flags Details
Latest build logs (26.23 KB, application/octet-stream)
2009-03-16 12:46 EDT, Andrew Clement CLA
no flags Details
AJDT UI version that does not perform model checking (1.79 MB, application/octet-stream)
2009-03-16 13:11 EDT, Andrew Eisenberg CLA
no flags Details
Trace No. 1 taken with patched ajdt.ui plugin (162.75 KB, text/plain)
2009-03-17 05:28 EDT, Thomas Hofmann CLA
no flags Details
Trace No. 2 takenn with patched ajdt.ui plugin (162.44 KB, application/octet-stream)
2009-03-17 05:29 EDT, Thomas Hofmann CLA
no flags Details
Another trace when a small change is made in class that multiple projects depend on (167.73 KB, application/octet-stream)
2009-03-17 10:48 EDT, Thomas Hofmann CLA
no flags Details
Trace where method Name was changed (183.93 KB, application/octet-stream)
2009-03-17 10:54 EDT, Thomas Hofmann CLA
no flags Details
Requested .classpath file (504 bytes, application/octet-stream)
2009-03-17 12:21 EDT, Thomas Hofmann CLA
no flags Details
Log of a run with latest AspectJ changes (27.38 KB, text/plain)
2009-03-18 16:10 EDT, Andrew Clement CLA
no flags Details
yourkit profile picture (75.04 KB, image/png)
2009-03-25 13:29 EDT, Andrew Clement CLA
no flags Details
trace no. 1 with new dev build (174.77 KB, application/octet-stream)
2009-03-27 05:58 EDT, Thomas Hofmann CLA
no flags Details
trace no. 2 with new dev build (172.05 KB, application/octet-stream)
2009-03-27 06:01 EDT, Thomas Hofmann CLA
no flags Details
trace no. 3 with new dev build (171.52 KB, text/plain)
2009-03-27 06:02 EDT, Thomas Hofmann CLA
no flags Details

Note You need to log in before you can comment on or make changes to this bug.
Description Andrew Clement CLA 2009-03-16 11:53:46 EDT
reported by Thomas on the list.
Comment 1 Andrew Clement CLA 2009-03-16 12:00:38 EDT
AJDT 1.6.3 log highlights

Not sure why there is an entry that says:
Resetting list of modified source files.  Was [C:\ws\ivk rsa 7.5\com.dcx.ivkmds.fwk.common.ass.persist\src\com\dcx\ivkmds\fwk\common\ass\persist\NlTextProperty.java, C:\ws\ivk rsa 7.5\com.dcx.ivkmds.fwk.common.ass.persist\src\com\dcx\ivkmds\fwk\common\ass\persist\NlTextProperty.java, C:\ws\ivk rsa 7.5\com.dcx.ivkmds.fwk.common.ass.persist\src\com\dcx\ivkmds\fwk\common\ass\persist\NlTextProperty.java, C:\ws\ivk rsa 7.5\com.dcx.ivkmds.fwk.common.ass.persist\src\com\dcx\ivkmds\fwk\common\ass\persist\NlTextProperty.java, C:\ws\ivk rsa 7.5\com.dcx.ivkmds.fwk.common.ass.persist\src\com\dcx\ivkmds\fwk\common\ass\persist\NlTextProperty.java, C:\ws\ivk rsa 7.5\com.dcx.ivkmds.fwk.common.ass.persist\src\com\dcx\ivkmds\fwk\common\ass\persist\NlTextProperty.java, C:\ws\ivk rsa 7.5\com.dcx.ivkmds.fwk.common.ass.persist\src\com\dcx\ivkmds\fwk\common\ass\persist\NlTextProperty.java, C:\ws\ivk rsa 7.5\com.dcx.ivkmds.fwk.common.ass.persist\src\com\dcx\ivkmds\fwk\common\ass\persist\NlTextProperty.java, C:\ws\ivk rsa 7.5\com.dcx.ivkmds.fwk.common.ass.persist\src\com\dcx\ivkmds\fwk\common\ass\persist\NlTextProperty.java, C:\ws\ivk rsa 7.5\com.dcx.ivkmds.fwk.common.ass.persist\src\com\dcx\ivkmds\fwk\common\ass\persist\NlTextProperty.java, C:\ws\ivk rsa 7.5\com.dcx.ivkmds.fwk.common.ass.persist\src\com\dcx\ivkmds\fwk\common\ass\persist\NlTextProperty.java, C:\ws\ivk rsa 7.5\com.dcx.ivkmds.fwk.common.ass.persist\src\com\dcx\ivkmds\fwk\common\ass\persist\NlTextProperty.java, C:\ws\ivk rsa 7.5\com.dcx.ivkmds.fwk.common.ass.persist\src\com\dcx\ivkmds\fwk\common\ass\persist\NlTextProperty.java, C:\ws\ivk rsa 7.5\com.dcx.ivkmds.fwk.common.ass.persist\src\com\dcx\ivkmds\fwk\common\ass\persist\NlTextProperty.java, C:\ws\ivk rsa 7.5\com.dcx.ivkmds.fwk.common.ass.persist\src\com\dcx\ivkmds\fwk\common\ass\persist\NlTextProperty.java, C:\ws\ivk rsa 7.5\com.dcx.ivkmds.fwk.common.ass.persist\src\com\dcx\ivkmds\fwk\common\ass\persist\NlTextProperty.java]

Surely it should only be mentioned once?

Timers for his whitespace project change build:
11:10:35 Timer event: 531ms: Total time spent in AJDE
11:10:35 Timer event: 266ms: Refresh after build
11:10:35 Types affected during build = 1
11:10:35 Timer event: 1078ms: Total time spent in AJBuilder.build()
11:10:36 Timer event: 125ms: Post compile

AJDE time is a little high. presumably rest of the wasted time in AJBuilder.build is model validation?

Build of depending project looks reasonable:
11:10:40 Build kind = AUTOBUILD
11:10:40 Project=com.dcx.ivkmds.fwk.common.businessobjects.persistent, kind of build requested=Incremental AspectJ compilation
11:10:40 build: Examined delta - no source file or classpath changes for project com.dcx.ivkmds.fwk.common.businessobjects.persistent
11:10:40 File: C:\ws\ivk rsa 7.5\com.dcx.ivkmds.fwk.common.ass.persist\src\com\dcx\ivkmds\fwk\common\ass\persist\NlTextProperty.java has changed.
11:10:40 build: Examined delta - 1 changed, 0 added, and 0 deleted source files in required project com.dcx.ivkmds.fwk.common.ass.persist
11:10:40 Setting list of classpath elements with modified contents:
11:10:40       [C:/ws/ivk rsa 7.5/com.dcx.ivkmds.fwk.common.ass.persist/bin, C:/ws/ivk rsa 7.5/com.dcx.ivkmds.fwk.common.ass.persist/bin]
11:10:40 Timer event: 47ms: Pre compile
11:10:40 Sending the following configuration changes to the compiler: []
11:10:40 0 source file changes since last build
11:10:40 Compiler configuration for project com.dcx.ivkmds.fwk.common.businessobjects.persistent has been read by compiler.  Resetting.
11:10:40      Configuration was []
11:10:40 Resetting list of modified source files.  Was []
11:10:40 Found state instance managing output location : C:\ws\ivk rsa 7.5\com.dcx.ivkmds.fwk.common.ass.persist\bin
11:10:40 Change detected in C:\ws\ivk rsa 7.5\com.dcx.ivkmds.fwk.common.ass.persist\bin\com\dcx\ivkmds\fwk\common\ass\persist\NlTextProperty.class but it is not structural
11:10:40 Found state instance managing output location : C:\ws\ivk rsa 7.5\com.dcx.ivkmds.fwk.common.ass.persist\bin
11:10:40 Change detected in C:\ws\ivk rsa 7.5\com.dcx.ivkmds.fwk.common.ass.persist\bin\com\dcx\ivkmds\fwk\common\ass\persist\NlTextProperty.class but it is not structural
11:10:40 Preparing for build: planning to be an incremental build
11:10:40 AspectJ reports build successful, build was: INCREMENTAL
11:10:40 AJDE Callback: finish. Was full build: false
11:10:40 Timer event: 31ms: Total time spent in AJDE
11:10:40 Timer event: 219ms: Refresh after build
11:10:40 Timer event: 328ms: Total time spent in AJBuilder.build()
11:10:40 Timer event: 125ms: Post compile

times for other downstream projects are fine (Time spent in AJDE):

com.dcx.ivkmds.fwk.rcs - 47ms
com.dcx.ivkmds.csolver.cts - 16ms
com.dcx.ivkmds.common.businessobjects.persistent - 125ms
com.dcx.ivkmds.common.businessobjects.fwktest - 219ms - included double analysis of the change for some reason
com.dcx.ivkmds.fwk.ass - 47ms
com.dcx.ivkmds.application.ass - 422ms 
com.dcx.ivkmds.csolver.ass - 328ms
com.dcx.ivkmds._45_export_import.ass - 375ms
com.dcx.ivkmds._00_fwktest.ass - 125ms
com.dcx.ivkmds.testfwk - 734ms - bit high, double analysis again
com.dcx.ivkmds.fwk.test.rcs - 860ms - high
com.dcx.ivkmds.fwk.test.ass - 891ms - high
com.dcx.ivkmds.fwk.test.common - 750ms - high
com.dcx.ivkmds._45_export_import.test.ass - 688ms - high

Comment 2 Andrew Clement CLA 2009-03-16 12:10:12 EDT
AJDT 1.6.4 log observations:

same problem reporting the same file changed lots of times:
14:54:56 Resetting list of modified source files.  Was [C:\ws\ivk rsa 7.5\com.dcx.ivkmds.fwk.common.ass.persist\src\com\dcx\ivkmds\fwk\common\ass\persist\NlTextProperty.java, C:\ws\ivk rsa 7.5\com.dcx.ivkmds.fwk.common.ass.persist\src\com\dcx\ivkmds\fwk\common\ass\persist\NlTextProperty.java, C:\ws\ivk rsa 7.5\com.dcx.ivkmds.fwk.common.ass.persist\src\com\dcx\ivkmds\fwk\common\ass\persist\NlTextProperty.java, C:\ws\ivk rsa 7.5\com.dcx.ivkmds.fwk.common.ass.persist\src\com\dcx\ivkmds\fwk\common\ass\persist\NlTextProperty.java, C:\ws\ivk rsa 7.5\com.dcx.ivkmds.fwk.common.ass.persist\src\com\dcx\ivkmds\fwk\common\ass\persist\NlTextProperty.java, C:\ws\ivk rsa 7.5\com.dcx.ivkmds.fwk.common.ass.persist\src\com\dcx\ivkmds\fwk\common\ass\persist\NlTextProperty.java, C:\ws\ivk rsa 7.5\com.dcx.ivkmds.fwk.common.ass.persist\src\com\dcx\ivkmds\fwk\common\ass\persist\NlTextProperty.java, C:\ws\ivk rsa 7.5\com.dcx.ivkmds.fwk.common.ass.persist\src\com\dcx\ivkmds\fwk\common\ass\persist\NlTextProperty.java, C:\ws\ivk rsa 7.5\com.dcx.ivkmds.fwk.common.ass.persist\src\com\dcx\ivkmds\fwk\common\ass\persist\NlTextProperty.java, C:\ws\ivk rsa 7.5\com.dcx.ivkmds.fwk.common.ass.persist\src\com\dcx\ivkmds\fwk\common\ass\persist\NlTextProperty.java, C:\ws\ivk rsa 7.5\com.dcx.ivkmds.fwk.common.ass.persist\src\com\dcx\ivkmds\fwk\common\ass\persist\NlTextProperty.java, C:\ws\ivk rsa 7.5\com.dcx.ivkmds.fwk.common.ass.persist\src\com\dcx\ivkmds\fwk\common\ass\persist\NlTextProperty.java, C:\ws\ivk rsa 7.5\com.dcx.ivkmds.fwk.common.ass.persist\src\com\dcx\ivkmds\fwk\common\ass\persist\NlTextProperty.java, C:\ws\ivk rsa 7.5\com.dcx.ivkmds.fwk.common.ass.persist\src\com\dcx\ivkmds\fwk\common\ass\persist\NlTextProperty.java, C:\ws\ivk rsa 7.5\com.dcx.ivkmds.fwk.common.ass.persist\src\com\dcx\ivkmds\fwk\common\ass\persist\NlTextProperty.java, C:\ws\ivk rsa 7.5\com.dcx.ivkmds.fwk.common.ass.persist\src\com\dcx\ivkmds\fwk\common\ass\persist\NlTextProperty.java]


14:54:58 Timer event: 1531ms: Total time spent in AJDE
14:54:58 Timer event: 235ms: Refresh after build
14:54:58 Types affected during build = 1
14:54:58 Crosscutting model sanity checked with no problems
14:54:58 Timer event: 1937ms: Total time spent in AJBuilder.build()
14:54:58 Timer event: 109ms: Post compile

3 times slower to build the code, not sure why - suppose it *could* be the extra incremental analysis we are now performing for declare parents statements. https://bugs.eclipse.org/bugs/show_bug.cgi?id=259649

dependent projects:
com.dcx.ivkmds.fwk.common.businessobjects.persistent - 406ms - contains double analysis (looks like it is probably just because something is on the classpath twice for the project)
com.dcx.ivkmds.fwk.rcs - 266ms
com.dcx.ivkmds.csolver.cts - 31ms

... having trouble processing the logs now because of all the model verification STUFF that is dumped in there.


Comment 3 Andrew Eisenberg CLA 2009-03-16 12:11:39 EDT
Created attachment 128945 [details]
AJDT Event trace for AJDT 1.6.3

Taken from mailing list.  This event trace shows the effect of a whitespace change.  It is taking longer than it should.  

One thing I notice is that the time for "Refresh after build" is taking too long.  It is well over half the time spent in AJBuilder.  Time spent in AJDE seems reasonable, though.

I suspect that these are projects with lots of files.
Comment 4 Andrew Eisenberg CLA 2009-03-16 12:13:34 EDT
Comment on attachment 128945 [details]
AJDT Event trace for AJDT 1.6.3

This is the event trace for the 1.6.3 version.
Comment 5 Andrew Clement CLA 2009-03-16 12:20:42 EDT
Ok, 1.6.4 logs:

com.dcx.ivkmds.fwk.common.ass.persist - 1531
com.dcx.ivkmds.fwk.common.businessobjects.persistent - 406ms
com.dcx.ivkmds.fwk.rcs - 266ms
com.dcx.ivkmds.csolver.cts - 31ms
com.dcx.ivkmds.common.businessobjects.persistent - 32ms
com.dcx.ivkmds.common.businessobjects.fwktest - 235ms
com.dcx.ivkmds.fwk.ass - 31ms
com.dcx.ivkmds.application.ass - 469ms
com.dcx.ivkmds.csolver.ass - 485ms
com.dcx.ivkmds._45_export_import.ass - 1516ms
com.dcx.ivkmds._00_fwktest.ass - 547ms
com.dcx.ivkmds.testfwk - 5500ms
com.dcx.ivkmds.fwk.test.rcs - 2875ms
com.dcx.ivkmds.fwk.test.ass - 5047ms
com.dcx.ivkmds.fwk.test.common - 1609ms
com.dcx.ivkmds._45_export_import.test.ass - 6203ms

Comment 6 Andrew Clement CLA 2009-03-16 12:31:01 EDT
we appear to be slowing down as we go along.  Things that worry me:

- Does the model checking code consume large amounts of memory?  
- Does it leak memory in any of its processing?

Given that the only logs we have to go on are 1.6.3 without model checking and 1.6.4 with model checking, it is hard to proceed on this.  We need a 1.6.4 log without model checking.  I know Andrew was working on making this something that could be switched off - i think we need Thomas to try a build with that option in, so at least we are comparing similar runs of the same thing.

The 1.6.3 times for AJDE (time spent in the AspectJ compiler) do not look completely unreasonable although it appears to be quite a project chain so there is a big knock-on compilation effect for other projects when a whitespace change is done in the top one.  However the whitespace change is correctly being recognized as non-structural.

In the 1.6.3 case, the times for the last 5 projects:
com.dcx.ivkmds.testfwk - 734ms 
com.dcx.ivkmds.fwk.test.rcs - 860ms - high
com.dcx.ivkmds.fwk.test.ass - 891ms - high
com.dcx.ivkmds.fwk.test.common - 750ms - high
com.dcx.ivkmds._45_export_import.test.ass - 688ms - high

seem a bit unusual compared to the rest.
Comment 7 Andrew Clement CLA 2009-03-16 12:46:49 EDT
Created attachment 128950 [details]
Latest build logs
Comment 8 Andrew Clement CLA 2009-03-16 12:50:56 EDT
In the new 1.6.3 logs we see that, yes, the classpath is a monster, especially for those downstream projects.  We ought to find a quick way to discount many of the early entries from our search. (We are searching to see if 'we' are managing any change-state for the classpath entries, if we are then we can make quick decisions about whether anything has changed, rather than diving in to check timestamps)
Comment 9 Andrew Eisenberg CLA 2009-03-16 13:11:39 EDT
Created attachment 128954 [details]
AJDT UI version that does not perform model checking

This version of the plugin has model checking turned off.  No other difference.  I've tried it myself and it seems to behave exactly the same as before, except no model checking is performed after build.

To install:

1. make a copy of your original org.eclipse.ajdt.ui_1.6.4.20090313172428.jar
2. replace with this one
3. perform a build with the AJDT Event Trace view open and make sure that model checking does not occur

Try this out and please post your results back here.
Comment 10 Andrew Eisenberg CLA 2009-03-16 13:14:56 EDT
Oh, and you must be using the latest dev build of AJDT (version 1.6.4.20090313172428, the release candidate).
Comment 11 Thomas Hofmann CLA 2009-03-17 05:28:44 EDT
Created attachment 129053 [details]
Trace No. 1 taken with patched ajdt.ui plugin

Performance feels like 1.6.3 (if not better)
Comment 12 Thomas Hofmann CLA 2009-03-17 05:29:42 EDT
Created attachment 129054 [details]
Trace No. 2 takenn with patched ajdt.ui plugin

Essentially the same trace as ajdt 1.6.4 patched - 5 -small change to NlTextProperty.tracen just a second run.
Comment 13 Thomas Hofmann CLA 2009-03-17 05:34:55 EDT
(In reply to comment #6)
> we appear to be slowing down as we go along.  Things that worry me:
> 
> - Does the model checking code consume large amounts of memory?  
> - Does it leak memory in any of its processing?
> 
> Given that the only logs we have to go on are 1.6.3 without model checking and
> 1.6.4 with model checking, it is hard to proceed on this.  We need a 1.6.4 log
> without model checking.  I know Andrew was working on making this something
> that could be switched off - i think we need Thomas to try a build with that
> option in, so at least we are comparing similar runs of the same thing.
> 
> The 1.6.3 times for AJDE (time spent in the AspectJ compiler) do not look
> completely unreasonable although it appears to be quite a project chain so
> there is a big knock-on compilation effect for other projects when a whitespace
> change is done in the top one.  However the whitespace change is correctly
> being recognized as non-structural.
> 
> In the 1.6.3 case, the times for the last 5 projects:
> com.dcx.ivkmds.testfwk - 734ms 
> com.dcx.ivkmds.fwk.test.rcs - 860ms - high
> com.dcx.ivkmds.fwk.test.ass - 891ms - high
> com.dcx.ivkmds.fwk.test.common - 750ms - high
> com.dcx.ivkmds._45_export_import.test.ass - 688ms - high
> 
> seem a bit unusual compared to the rest.
> 


The testfwk project contains some framework classes (superclasses and utilities) for unit test. It also contains three .aj files with aspects that apply to some of the testfwk classes as well as to the actual test found in the projects test.rcs, test.ass, test.common, _45_export_import.test.ass.

Comment 14 Thomas Hofmann CLA 2009-03-17 05:36:24 EDT
(In reply to comment #13)
> (In reply to comment #6)
> > we appear to be slowing down as we go along.  Things that worry me:
> > 
> > - Does the model checking code consume large amounts of memory?  
> > - Does it leak memory in any of its processing?
> > 
> > Given that the only logs we have to go on are 1.6.3 without model checking and
> > 1.6.4 with model checking, it is hard to proceed on this.  We need a 1.6.4 log
> > without model checking.  I know Andrew was working on making this something
> > that could be switched off - i think we need Thomas to try a build with that
> > option in, so at least we are comparing similar runs of the same thing.
> > 
> > The 1.6.3 times for AJDE (time spent in the AspectJ compiler) do not look
> > completely unreasonable although it appears to be quite a project chain so
> > there is a big knock-on compilation effect for other projects when a whitespace
> > change is done in the top one.  However the whitespace change is correctly
> > being recognized as non-structural.
> > 
> > In the 1.6.3 case, the times for the last 5 projects:
> > com.dcx.ivkmds.testfwk - 734ms 
> > com.dcx.ivkmds.fwk.test.rcs - 860ms - high
> > com.dcx.ivkmds.fwk.test.ass - 891ms - high
> > com.dcx.ivkmds.fwk.test.common - 750ms - high
> > com.dcx.ivkmds._45_export_import.test.ass - 688ms - high
> > 
> > seem a bit unusual compared to the rest.
> > 
> 
> 
> The testfwk project contains some framework classes (superclasses and
> utilities) for unit test. It also contains three .aj files with aspects that
> apply to some of the testfwk classes as well as to the actual test found in the
> projects test.rcs, test.ass, test.common, _45_export_import.test.ass.
> 

Do you need some numbers about projects, number of types etc? Which ones?
Comment 15 Thomas Hofmann CLA 2009-03-17 05:48:24 EDT
BTW, here is some information on the computer I am using. It is a Lenovo T61P with:

- Intel Core 2 Duo T9500 @ 2.6 Ghz
- 4 GB RAM (only 3 usable due to 32 bit Windows XP)
- HD: HTS722020K9SA00 with 7200 RPM
Comment 16 Thomas Hofmann CLA 2009-03-17 10:48:10 EDT
Created attachment 129090 [details]
Another trace when a small change is made in class that multiple projects depend on

I add this trace so that you have another trace to look at. I made only an internal change to a method.
Comment 17 Thomas Hofmann CLA 2009-03-17 10:54:06 EDT
Created attachment 129092 [details]
Trace where method Name was changed

Just on more trace
Comment 18 Andrew Clement CLA 2009-03-17 11:46:07 EDT
Thanks for the traces Thomas.  I'm on a T61p too ;)

> Do you need some numbers about projects, number of types etc? Which ones?

I think I have enough to tinker a little bit - but Andrew might want more info?  In each case the 'time spent in AJDE' is the time spent in the compiler itself whilst the 'time spent in AJBuilder.build()' is that plus time spent in AJDT preparing for the build and processing whatever the compiler did.  I look at the former times and Andrew looks into the AJDT times.

From an AJDE point of view, my biggest concern is the loong 'time spent in AJDE' times towards the end of each log where the compiler is not actually doing any building, but is just taking a while to work out that it doesn't need to.  I don't have any project configs like that, with a long chain of dependencies, but I'll try and fake something up.  I have a suspicion of the cause but it'll take a while to confirm.
Comment 19 Andrew Clement CLA 2009-03-17 12:00:54 EDT
Ok, converted all of AspectJ to be AspectJ projects - making a small change in the FileUtil class (in util project) causes multiple downstream rebuilds, the final one:

9:0:6 Build kind = AUTOBUILD
9:0:6 Project=run-all-junit-tests, kind of build requested=Incremental AspectJ compilation
9:0:6 build: Examined delta - no source file or classpath changes for project run-all-junit-tests
9:0:6 File: D:\Andy\eclipse_ws\ws34\util\src\org\aspectj\util\FileUtil.java has changed.
9:0:6 build: Examined delta - 1 changed, 0 added, and 0 deleted source files in required project util
9:0:6 Setting list of classpath elements with modified contents:
9:0:6       [D:/Andy/eclipse_ws/ws34/ajbrowser/bin, D:/Andy/eclipse_ws/ws34/ajde/bin, D:/Andy/eclipse_ws/ws34/asm/bin, D:/Andy/eclipse_ws/ws34/bridge/bin, D:/Andy/eclipse_ws/ws34/taskdefs/bin, D:/Andy/eclipse_ws/ws34/lib/commons/commons.jar, D:/Andy/eclipse_ws/ws34/testing/bin, D:/Andy/eclipse_ws/ws34/testing-client/bin, D:/Andy/eclipse_ws/ws34/testing-drivers/bin, D:/Andy/eclipse_ws/ws34/testing-util/bin, D:/Andy/eclipse_ws/ws34/util/bin, D:/Andy/eclipse_ws/ws34/weaver/bin, D:/Andy/eclipse_ws/ws34/tests/bin, D:/Andy/eclipse_ws/ws34/ajdoc/bin, D:/Andy/eclipse_ws/ws34/util/bin, D:/Andy/eclipse_ws/ws34/bridge/bin, D:/Andy/eclipse_ws/ws34/asm/bin, D:/Andy/eclipse_ws/ws34/org.aspectj.ajdt.core/bin, D:/Andy/eclipse_ws/ws34/org.eclipse.jdt.core/jdtcore-for-aspectj.jar, D:/Andy/eclipse_ws/ws34/ajde.core/bin, D:/Andy/eclipse_ws/ws34/org.aspectj.matcher/bin]
9:0:6 Classpath = D:\Andy\eclipse_ws\ws34\run-all-junit-tests\bin;C:/jvms/jdk1.6.0_10/jre/lib/resources.jar;C:/jvms/jdk1.6.0_10/jre/lib/rt.jar;C:/jvms/jdk1.6.0_10/jre/lib/jsse.jar;C:/jvms/jdk1.6.0_10/jre/lib/jce.jar;C:/jvms/jdk1.6.0_10/jre/lib/charsets.jar;C:/jvms/jdk1.6.0_10/jre/lib/ext/dnsns.jar;C:/jvms/jdk1.6.0_10/jre/lib/ext/dns_sd.jar;C:/jvms/jdk1.6.0_10/jre/lib/ext/localedata.jar;C:/jvms/jdk1.6.0_10/jre/lib/ext/sunjce_provider.jar;C:/jvms/jdk1.6.0_10/jre/lib/ext/sunmscapi.jar;C:/jvms/jdk1.6.0_10/jre/lib/ext/sunpkcs11.jar;D:\Andy\eclipse_ws\ws34\ajbrowser\bin;D:\Andy\eclipse_ws\ws34\ajde\bin;D:\Andy\eclipse_ws\ws34\asm\bin;D:\Andy\eclipse_ws\ws34\bridge\bin;D:\Andy\eclipse_ws\ws34\build\bin;D:\Andy\eclipse_ws\ws34\org.aspectj.ajdt.core\bin;D:/Andy/eclipse_ws/ws34/org.eclipse.jdt.core/jdtcore-for-aspectj.jar;D:\Andy\eclipse_ws\ws34\runtime\bin;D:\Andy\eclipse_ws\ws34\taskdefs\bin;D:\Andy\eclipse_ws\ws34\testing\bin;D:/Andy/eclipse_ws/ws34/lib/commons/commons.jar;D:\Andy\eclipse_ws\ws34\testing-client\bin;D:\Andy\eclipse_ws\ws34\testing-drivers\bin;D:\Andy\eclipse_ws\ws34\testing-util\bin;D:\Andy\eclipse_ws\ws34\util\bin;D:\Andy\eclipse_ws\ws34\weaver\bin;D:/Andy/eclipse_ws/ws34/lib/junit/junit.jar;D:\Andy\eclipse_ws\ws34\tests\bin;D:\Andy\eclipse_ws\ws34\aspectj5rt\bin;D:\Andy\eclipse_ws\ws34\ajdoc\bin;D:\Andy\eclipse_ws\ws34\loadtime\bin;D:\Andy\eclipse_ws\ws34\loadtime5\bin;D:\Andy\eclipse_ws\ws34\weaver5\bin;D:\Andy\eclipse_ws\ws34\ajde.core\bin;D:\Andy\eclipse_ws\ws34\org.aspectj.matcher\bin;D:/Andy/e34/eclipse/plugins/org.aspectj.runtime_1.6.4.20090304172355/aspectjrt.jar;
9:0:6 Timer event: 2ms: Pre compile
9:0:6 Sending the following configuration changes to the compiler: []
9:0:6 0 source file changes since last build
9:0:6 Compiler configuration for project run-all-junit-tests has been read by compiler.  Resetting.
9:0:6      Configuration was []
9:0:6 Resetting list of modified source files.  Was []
9:0:6 Found state instance managing output location : D:\Andy\eclipse_ws\ws34\ajbrowser\bin
9:0:6 Found state instance managing output location : D:\Andy\eclipse_ws\ws34\ajde\bin
9:0:6 Found state instance managing output location : D:\Andy\eclipse_ws\ws34\asm\bin
9:0:6 Found state instance managing output location : D:\Andy\eclipse_ws\ws34\bridge\bin
9:0:6 Found state instance managing output location : D:\Andy\eclipse_ws\ws34\taskdefs\bin
9:0:6 Found state instance managing output location : D:\Andy\eclipse_ws\ws34\testing\bin
9:0:6 Found state instance managing output location : D:\Andy\eclipse_ws\ws34\testing-client\bin
9:0:6 Found state instance managing output location : D:\Andy\eclipse_ws\ws34\testing-drivers\bin
9:0:6 Found state instance managing output location : D:\Andy\eclipse_ws\ws34\testing-util\bin
9:0:6 Found state instance managing output location : D:\Andy\eclipse_ws\ws34\util\bin
9:0:6 Change detected in D:\Andy\eclipse_ws\ws34\util\bin\org\aspectj\util\FileUtil$1.class but it is not structural
9:0:6 Change detected in D:\Andy\eclipse_ws\ws34\util\bin\org\aspectj\util\FileUtil$2.class but it is not structural
9:0:6 Change detected in D:\Andy\eclipse_ws\ws34\util\bin\org\aspectj\util\FileUtil$3.class but it is not structural
9:0:6 Change detected in D:\Andy\eclipse_ws\ws34\util\bin\org\aspectj\util\FileUtil$4.class but it is not structural
9:0:6 Change detected in D:\Andy\eclipse_ws\ws34\util\bin\org\aspectj\util\FileUtil$5.class but it is not structural
9:0:6 Change detected in D:\Andy\eclipse_ws\ws34\util\bin\org\aspectj\util\FileUtil$Pipe.class but it is not structural
9:0:6 Change detected in D:\Andy\eclipse_ws\ws34\util\bin\org\aspectj\util\FileUtil.class but it is not structural
9:0:6 Found state instance managing output location : D:\Andy\eclipse_ws\ws34\weaver\bin
9:0:6 Found state instance managing output location : D:\Andy\eclipse_ws\ws34\tests\bin
9:0:6 Timer event: 0ms: Post compile
9:0:6 Found state instance managing output location : D:\Andy\eclipse_ws\ws34\ajdoc\bin
9:0:6 Found state instance managing output location : D:\Andy\eclipse_ws\ws34\util\bin
9:0:6 Change detected in D:\Andy\eclipse_ws\ws34\util\bin\org\aspectj\util\FileUtil$1.class but it is not structural
9:0:6 Change detected in D:\Andy\eclipse_ws\ws34\util\bin\org\aspectj\util\FileUtil$2.class but it is not structural
9:0:6 Change detected in D:\Andy\eclipse_ws\ws34\util\bin\org\aspectj\util\FileUtil$3.class but it is not structural
9:0:6 Change detected in D:\Andy\eclipse_ws\ws34\util\bin\org\aspectj\util\FileUtil$4.class but it is not structural
9:0:6 Change detected in D:\Andy\eclipse_ws\ws34\util\bin\org\aspectj\util\FileUtil$5.class but it is not structural
9:0:6 Change detected in D:\Andy\eclipse_ws\ws34\util\bin\org\aspectj\util\FileUtil$Pipe.class but it is not structural
9:0:6 Change detected in D:\Andy\eclipse_ws\ws34\util\bin\org\aspectj\util\FileUtil.class but it is not structural
9:0:6 Found state instance managing output location : D:\Andy\eclipse_ws\ws34\bridge\bin
9:0:6 Found state instance managing output location : D:\Andy\eclipse_ws\ws34\asm\bin
9:0:6 Failed to find a state instance managing output location : D:\Andy\eclipse_ws\ws34\org.aspectj.ajdt.core\bin
9:0:6 Found state instance managing output location : D:\Andy\eclipse_ws\ws34\ajde.core\bin
9:0:6 Found state instance managing output location : D:\Andy\eclipse_ws\ws34\org.aspectj.matcher\bin
9:0:7 Preparing for build: planning to be an incremental build
9:0:7 AspectJ reports build successful, build was: INCREMENTAL
9:0:7 AJDE Callback: finish. Was full build: false
9:0:7 Timer event: 493ms: Total time spent in AJDE
9:0:7 Timer event: 9ms: Refresh after build
9:0:7 Crosscutting model sanity checked with no problems
9:0:7 Timer event: 504ms: Total time spent in AJBuilder.build()

This final project taking 493ms just to check it doesn't have to do anything - it has a similar look to the traces for Thomas' final projects. time to fire up yourkit
Comment 20 Andrew Eisenberg CLA 2009-03-17 12:05:51 EDT
I am concerned about the time it is taking for refreshing a project.  I created bug 269017 to see if it is still necessary to refresh the project after a build.

Also, I am a little confused by how the same file appears as changed many times in the list of modified files.  Could you post your .classpath file for the project that contains this class?
Comment 21 Thomas Hofmann CLA 2009-03-17 12:21:02 EDT
Created attachment 129105 [details]
Requested .classpath file

It contains an entry for <classpathentry kind="con" path="org.eclipse.tptp.platform.instrumentation.ui.ContainerInitializer/Build to Manage Libraries"/> which must have been added recently while I was "playing around" with the new features in RSA 7.5. It is not needed there I I just noticed that it is there. I will remove it and see if it makes a difference.
Comment 22 Andrew Clement CLA 2009-03-17 12:42:28 EDT
ok, yourkit numbers for a whitespace change.  This causes 15 downstream project rebuilds to occur.

Two numbers are:
- time spent in this method and below
- time spent in this method alone

AjCompiler.build()  3697ms 0 (invoked 16 times)
  AjdeCoreBuildManager.performBuild(boolean) 3697 0
    AjBuildManager.incrementalBuild(AjBuildConfig, IMessageHandler) 3697 0
      AjBuildManager.performBuild(AjBuildConfig, IMessageHandler, boolean) 3697 0
        AjBuildManager.performCompilation(Collection) 2277 0
        AjState.prepareForNextBuild(AjBuildConfig) 1404 0
          AjState.pathChange(AjBuildConfig, AjBuildConfig)   1388 15
            AjState.classFileChangedInDirSinceFullBuild(File) 1357 15
              "java.io.File.lastModified() 811 811
              "org.aspectj.util.FileUtil.listClassFiles(File) 499 0
              "java.util.AbstractList$Itr.next() 15 15
              IncrementalStateManager.findStateManagingOutputLocation(File) 15
              "java.io.File.exists() 15 15
            AJBuilder$2.recordDecision(String) 15 15
        AjState.getBinaryFilesToCompile(boolean) 15 0

interpretation:
16 times we enter performBuild, 1 time that leads to a compilation (performCompilation()), 15 times it leads to 'prepareForNextBuild()'.  In prepareForNextBuild we analyse the changes that occurred in code we depend upon.

In prepareForNextBuild - in which we are spending 1.4seconds in a profiled run, we spend 0.8seconds calling File.lastModified() and 0.5seconds listing the class files in a directory (so we can call lastModified)

So optimizing prepareForNextBuild would potentially remove 1.3seconds of the 1.4seconds spent in prepareForNextBuild
Comment 23 Andrew Clement CLA 2009-03-17 15:19:04 EDT
I'm also seeing this problem of the changed file appear multiple times.  I only make one whitespace change in FileUtil.java and save but it is listed 16 times in the changes list in the event trace:  (not sure if the 16 is related to how many projects I have in my workspace, or it is just coincidence that it matches how many projects will get built).

19:17:38 ===========================================================================================
19:17:38 Build kind = AUTOBUILD
19:17:38 Project=util, kind of build requested=Incremental AspectJ compilation
19:17:38 File: D:\Andy\eclipse_ws\ws34\util\src\org\aspectj\util\FileUtil.java has changed.
19:17:38 build: Examined delta - 1 changed, 0 added, and 0 deleted source files in required project util
19:17:38 Setting list of classpath elements with modified contents:
19:17:38       []
19:17:38 Classpath = D:\Andy\eclipse_ws\ws34\util\bin;D:/Andy/eclipse_ws/ws34/lib/junit/junit.jar;C:/jvms/jdk1.6.0_10/jre/lib/resources.jar;C:/jvms/jdk1.6.0_10/jre/lib/rt.jar;C:/jvms/jdk1.6.0_10/jre/lib/jsse.jar;C:/jvms/jdk1.6.0_10/jre/lib/jce.jar;C:/jvms/jdk1.6.0_10/jre/lib/charsets.jar;C:/jvms/jdk1.6.0_10/jre/lib/ext/dnsns.jar;C:/jvms/jdk1.6.0_10/jre/lib/ext/dns_sd.jar;C:/jvms/jdk1.6.0_10/jre/lib/ext/localedata.jar;C:/jvms/jdk1.6.0_10/jre/lib/ext/sunjce_provider.jar;C:/jvms/jdk1.6.0_10/jre/lib/ext/sunmscapi.jar;C:/jvms/jdk1.6.0_10/jre/lib/ext/sunpkcs11.jar;D:/Andy/e34/eclipse/plugins/org.aspectj.runtime_1.6.4.20090304172355/aspectjrt.jar;
19:17:38 Timer event: 12ms: Pre compile
19:17:38 Sending the following configuration changes to the compiler: []
19:17:38 16 source file changes since last build
19:17:38 Compiler configuration for project util has been read by compiler.  Resetting.
19:17:38      Configuration was []
19:17:38 Resetting list of modified source files.  Was [D:\Andy\eclipse_ws\ws34\util\src\org\aspectj\util\FileUtil.java, D:\Andy\eclipse_ws\ws34\util\src\org\aspectj\util\FileUtil.java, D:\Andy\eclipse_ws\ws34\util\src\org\aspectj\util\FileUtil.java, D:\Andy\eclipse_ws\ws34\util\src\org\aspectj\util\FileUtil.java, D:\Andy\eclipse_ws\ws34\util\src\org\aspectj\util\FileUtil.java, D:\Andy\eclipse_ws\ws34\util\src\org\aspectj\util\FileUtil.java, D:\Andy\eclipse_ws\ws34\util\src\org\aspectj\util\FileUtil.java, D:\Andy\eclipse_ws\ws34\util\src\org\aspectj\util\FileUtil.java, D:\Andy\eclipse_ws\ws34\util\src\org\aspectj\util\FileUtil.java, D:\Andy\eclipse_ws\ws34\util\src\org\aspectj\util\FileUtil.java, D:\Andy\eclipse_ws\ws34\util\src\org\aspectj\util\FileUtil.java, D:\Andy\eclipse_ws\ws34\util\src\org\aspectj\util\FileUtil.java, D:\Andy\eclipse_ws\ws34\util\src\org\aspectj\util\FileUtil.java, D:\Andy\eclipse_ws\ws34\util\src\org\aspectj\util\FileUtil.java, D:\Andy\eclipse_ws\ws34\util\src\org\aspectj\util\FileUtil.java, D:\Andy\eclipse_ws\ws34\util\src\org\aspectj\util\FileUtil.java]
19:17:38 Preparing for build: planning to be an incremental build
19:17:38 Starting incremental compilation loop 1 of possibly 5
19:17:39 Timer event: 446ms: Time to first compiled message
19:17:39 Timer event: 451ms: Time to first woven message
Comment 24 Andrew Clement CLA 2009-03-17 15:25:45 EDT
I have a prototype of a version that calls lastModifiedTime far less.  My times for the dependee project builds used to be:

 Timer event: 120ms: Total time spent in AJDE
 Timer event: 11ms: Total time spent in AJDE
 Timer event: 17ms: Total time spent in AJDE
 Timer event: 24ms: Total time spent in AJDE
 Timer event: 26ms: Total time spent in AJDE
 Timer event: 25ms: Total time spent in AJDE
 Timer event: 96ms: Total time spent in AJDE
 Timer event: 27ms: Total time spent in AJDE
 Timer event: 28ms: Total time spent in AJDE
 Timer event: 41ms: Total time spent in AJDE
 Timer event: 106ms: Total time spent in AJDE
 Timer event: 215ms: Total time spent in AJDE
 Timer event: 97ms: Total time spent in AJDE
 Timer event: 268ms: Total time spent in AJDE
 Timer event: 144ms: Total time spent in AJDE
 Timer event: 302ms: Total time spent in AJDE

and now they are:

Timer event: 3ms: Total time spent in AJDE
Timer event: 6ms: Total time spent in AJDE
Timer event: 6ms: Total time spent in AJDE
Timer event: 5ms: Total time spent in AJDE
Timer event: 6ms: Total time spent in AJDE
Timer event: 31ms: Total time spent in AJDE
Timer event: 6ms: Total time spent in AJDE
Timer event: 8ms: Total time spent in AJDE
Timer event: 30ms: Total time spent in AJDE
Timer event: 58ms: Total time spent in AJDE
Timer event: 110ms: Total time spent in AJDE
Timer event: 23ms: Total time spent in AJDE
Timer event: 81ms: Total time spent in AJDE
Timer event: 90ms: Total time spent in AJDE
Timer event: 123ms: Total time spent in AJDE

that is down from a total of 1.427 seconds to 0.586 seconds and the saving will scale with however much work has to be done.  Those latter ones are still high, wonder why?
Comment 25 Thomas Hofmann CLA 2009-03-18 04:25:41 EDT
(In reply to comment #24)

I am wondering why it is necessary to iterate over all dependent projects at all. If I make a change only to a method body for example what needs to be done in dependent projects?

As I can see from the traces it is recognized that there are no structural changes in the class the others depend upon. 

And why need the dependent projects be checked for last modification? I can only imagine that this would need to be done if build all was switched off and is now turned on again and thus it would be possible that these projects needed to be rebuilt.

Can you explain this to me please?

Comment 26 Andrew Clement CLA 2009-03-18 12:58:21 EDT
> I am wondering why it is necessary to iterate over all dependent projects at
> all. If I make a change only to a method body for example what needs to be
> done in dependent projects?

The intention is the cost of downstream projects should be negligible and you shouldn't notice it, because those builds should terminate straightaway when deciding there is nothing they need to do.  That is not the case at the moment, as you are seeing in your case.  The eclipse infrastructure is driving these builds based on project dependencies, not me.  JDT is not as vocal about logging what it is doing, and is rather more optimal in its analysis, so you don't notice it.  From the times for the initial few downstream projects in my most recent comment:

Timer event: 3ms: Total time spent in AJDE
Timer event: 6ms: Total time spent in AJDE
Timer event: 6ms: Total time spent in AJDE
Timer event: 5ms: Total time spent in AJDE
Timer event: 6ms: Total time spent in AJDE

Even if there were 20 projects downstream and they all took 10ms, you wouldn't really notice it, and it would be even less if the event trace view was closed.  But currently it is these further downstream ones that need addressing:

Timer event: 110ms: Total time spent in AJDE
Timer event: 23ms: Total time spent in AJDE
Timer event: 81ms: Total time spent in AJDE
Timer event: 90ms: Total time spent in AJDE
Timer event: 123ms: Total time spent in AJDE

You should understand that what we have now is a general solution to incremental compilation, it is far from finished or optimized.  I work on situations as I can, when they get to the top of my priority list (yours came up to the top because you observed a regression from 1.6.4 to 1.6.3 and that is unacceptable). If work is done to optimize the downstream builds then that benefits all situations: whether a white space change, a method body change or a structural change.  Until as recently as AspectJ 1.6.2 the performance was even worse but I did a huge chunk of work under bug 245566 to improve things.  That still left some work to do on the multi project setups, and that is covered by bug 249212 (which is still open) - although I seem to be addressing it in this one actually.

> As I can see from the traces it is recognized that there are no structural
> changes in the class the others depend upon. 
>
> And why need the dependent projects be checked for last modification? I can
> only imagine that this would need to be done if build all was switched off and
> is now turned on again and thus it would be possible that these projects
> needed to be rebuilt.

lastModificationTime needs to be used in cases where there is no state maintained for the class files upon which the project is depending.  The state captures detailed information about inter-type dependencies and when sources were last fully built.  There can be a few reasons for this:

- you have some external class folder on your classpath, inpath or aspectpath.  We have no state for it, we don't know what changes might have been made to the .class files.  The only way to know if we need to rebuild this project is whether the last modification times for .class files in the class folder are later than the last time we built this project.  Maybe you did just make a method body change, but if all i have to go on is the timestamp change for the .class file then I don't know that, and if I don't assume the worst (and so do a full build) there will be situations where you change something and we don't pick it up - that would be awful.

- you depend on a Java project.  The JDT keeps its state projects in black box entities which we have trouble seeing inside of, so we don't know what has changed in the other project.  We have made progress on this issue, but there is still more to be done.

So... I'll carry on fixing things as I can.  Incremental compilation is the most complex area of the code, with the most possible variations in user configurations and is tricky to write testcases for.
Comment 27 Andrew Clement CLA 2009-03-18 16:07:02 EDT
Here are todays numbers which I am quite pleased with.

Timer event: 175ms: Total time spent in AJDE
Timer event: 1ms: Total time spent in AJDE
Timer event: 1ms: Total time spent in AJDE
Timer event: 1ms: Total time spent in AJDE
Timer event: 1ms: Total time spent in AJDE
Timer event: 1ms: Total time spent in AJDE
Timer event: 1ms: Total time spent in AJDE
Timer event: 1ms: Total time spent in AJDE
Timer event: 2ms: Total time spent in AJDE
Timer event: 1ms: Total time spent in AJDE
Timer event: 1ms: Total time spent in AJDE
Timer event: 1ms: Total time spent in AJDE
Timer event: 2ms: Total time spent in AJDE
Timer event: 3ms: Total time spent in AJDE
Timer event: 2ms: Total time spent in AJDE
Timer event: 2ms: Total time spent in AJDE
Timer event: 1ms: Total time spent in AJDE
Timer event: 2ms: Total time spent in AJDE
Timer event: 9ms: Total time spent in AJDE

but they do unfortunately shift a lot of blame to AJDT (these times include the AJDE time):

Timer event: 223ms: Total time spent in AJBuilder.build()
Timer event: 38ms: Total time spent in AJBuilder.build()
Timer event: 43ms: Total time spent in AJBuilder.build()
Timer event: 21ms: Total time spent in AJBuilder.build()
Timer event: 36ms: Total time spent in AJBuilder.build()
Timer event: 123ms: Total time spent in AJBuilder.build()
Timer event: 126ms: Total time spent in AJBuilder.build()
Timer event: 59ms: Total time spent in AJBuilder.build()
Timer event: 199ms: Total time spent in AJBuilder.build()
Timer event: 53ms: Total time spent in AJBuilder.build()
Timer event: 46ms: Total time spent in AJBuilder.build()
Timer event: 85ms: Total time spent in AJBuilder.build()
Timer event: 143ms: Total time spent in AJBuilder.build()
Timer event: 119ms: Total time spent in AJBuilder.build()
Timer event: 48ms: Total time spent in AJBuilder.build()
 Timer event: 2898ms: Total time spent in AJBuilder.build()
 Timer event: 80ms: Total time spent in AJBuilder.build()
 Timer event: 28ms: Total time spent in AJBuilder.build()
 Timer event: 24ms: Total time spent in AJBuilder.build()

i'm still testing these changes, nothing committed yet.
Comment 28 Andrew Clement CLA 2009-03-18 16:10:28 EDT
Created attachment 129284 [details]
Log of a run with latest AspectJ changes

Here is a complete log for a whitespace change to the top level project.
Comment 29 Andrew Clement CLA 2009-03-18 17:11:28 EDT
All AspectJ changes are in - this will help the AJDE times - it should be in an imminent AJDT 1.6.5 dev build.  Needs a lot of testing before AspectJ 1.6.4 is final though.  I don't plan to do anything further on the AspectJ side for this bug unless there are still issues with Thomas' configuration and the fixes so far.  I know Andrew is now looking into reducing the AJDT times.
Comment 30 Andrew Clement CLA 2009-03-18 22:23:18 EDT
i should say that obviously i reduced the times so drastically by removing unnecessary calls to lastModifiedTime() and listClassFiles() because there were some situations where we were erroneously not trusting the state object when we should have.

However, as I'm uncovering in bug 267245 the lack of proper support for when the aj project depends on a java project (because we can't see into their state) needs addressing as we will fall back on listClassFiles()/lastModifiedTime(). 
Comment 31 Thomas Hofmann CLA 2009-03-19 06:34:16 EDT
First of all thanks for your efforts you are putting into this.

I have one more questions. If I understand correctly the problem is that you need to determine if the class files in a project A have changed in case project B depends on it. This will only be of interest in case project B is an AspectJ project.

If project A is also an AspectJ project the state about project A is saved in an AJDE internal data structure (BTW what does AJDE stand for?). So it is easy to determine if class files that have changed since the last time project A was build exist in project B. This state is not persistent at the moment (see bug 268822).

Now, when I make a white space change in project B project A will be built. If project A also depends on say project C which is not an AspectJ project you will need to fall back to checking last modification times of the class files in project C. Is this correct?

If so wouldn't it be even faster if I'd convert all Java projects to AspectJ projects to speedup these issues?
The problem is that currently I have quite a lot of projects upon which some of the downstream AspectJ projects depend on. 

In the concrete sample for which I made the traces it is like this.

I am making a change to fwk.common.ass.persist which is an AspectJ project. The downstream project fwk.rcs is also an Aspectj project but it depends on these projects:

org.eclipse.ui
org.eclipse.core.runtime
org.eclipse.ui.forms
org.apache.commons.lang
com.dcx.iap.clientcontainer.plugin
com.ibm.ebiz.fwk
com.ibm.ebiz.fwk.eclipse
com.dcx.ivkmds.fwk.common
com.dcx.ivkmds.fwk.common.ass.cmd
com.dcx.ivkmds.fwk.common.ass.cmd.ejb.client
com.dcx.ivkmds.fwk.common.ass.error
com.dcx.ivkmds.fwk.common.ass.lrt
com.dcx.ivkmds.fwk.common.ass.persist -> AspectJ project
com.dcx.ivkmds.fwk.common.ass.security
com.dcx.ivkmds.fwk.common.ass.usecase
com.dcx.ivkmds.fwk.common.spec.error
com.dcx.ivkmds.fwk.common.spec.lrt
com.dcx.ivkmds.fwk.common.spec.trace
com.dcx.ivkmds.fwk.common.spec.perflog
com.dcx.ivkmds.fwk.common.spec.time
org.aspectj.runtime 

Only one of these referenced projects is an AspectJ project

I could convert these projects to AspectJ projects:

com.ibm.ebiz.fwk
com.ibm.ebiz.fwk.eclipse
com.dcx.ivkmds.fwk.common
com.dcx.ivkmds.fwk.common.ass.cmd
com.dcx.ivkmds.fwk.common.ass.cmd.ejb.client
com.dcx.ivkmds.fwk.common.ass.error
com.dcx.ivkmds.fwk.common.ass.lrt
com.dcx.ivkmds.fwk.common.ass.persist -> AspectJ project
com.dcx.ivkmds.fwk.common.ass.security
com.dcx.ivkmds.fwk.common.ass.usecase
com.dcx.ivkmds.fwk.common.spec.error
com.dcx.ivkmds.fwk.common.spec.lrt
com.dcx.ivkmds.fwk.common.spec.trace
com.dcx.ivkmds.fwk.common.spec.perflog
com.dcx.ivkmds.fwk.common.spec.time

The others are precompiled.

That said, I believe working on getting the necessary state form JDT directly would improve performance in my case a lot. How are the chances getting this done?







Comment 32 Andrew Clement CLA 2009-03-19 12:19:23 EDT
This is now live in the latest AJDT dev builds.

> If project A is also an AspectJ project the state about project A is saved in
> an AJDE internal data structure (BTW what does AJDE stand for?). So it is easy
> to determine if class files that have changed since the last time project A
> was build exist in project B. This state is not persistent at the moment 
> (see bug 268822).

AJDE is kind of an historical thing, a name for the AspectJ Development Environment interface - the point where an IDE hands over to the compiler to do compilation.  AJDE is suitable for plugging into any IDE (eclipse or something else).

> If so wouldn't it be even faster if I'd convert all Java projects to AspectJ
> projects to speedup these issues?

Yes, it will - but I'm always nervous to suggest that to people, it may be just too big of a step for them.  And it kind of forces AspectJ on them to work around a bug we haven't fixed yet - it used to be more painful than it is now because at least the editors are well behaved in an aj project now.  I just tried it myself and have attached some numbers at the end of this comment based on todays AJDT dev build.

Converting them all to AJ may also impact your eclipse start time as all the projects (even those that used to be Java) will be rebuilt from scratch.

> That said, I believe working on getting the necessary state form JDT directly
> would improve performance in my case a lot. How are the chances getting this
> done?

Without JDT weaving it would be very tricky, but now that AJDT is capable of weaving JDT as eclipse starts, we can do it more easily.  It is not a trivial bit of work though - initially I'll use some reflection to get at the state and if that works look to modify it more cleanly with JDT Weaving.

Have you tried the latest build just to see if your numbers are any better?

Here are my figures with the latest build for AJDE and in the AJDT builder.  Initially one project is still a Java project in the chain:

Timer event: 108ms: Total time spent in AJDE
Timer event: 1ms: Total time spent in AJDE
Timer event: 1ms: Total time spent in AJDE
Timer event: 0ms: Total time spent in AJDE
Timer event: 0ms: Total time spent in AJDE
Timer event: 1ms: Total time spent in AJDE
Timer event: 0ms: Total time spent in AJDE
Timer event: 0ms: Total time spent in AJDE
Timer event: 0ms: Total time spent in AJDE
Timer event: 0ms: Total time spent in AJDE
Timer event: 0ms: Total time spent in AJDE
>> this next project is the first time we hit a project build that
>> has a java project dependency - see the jump in time, here and for 
>> all downstream builds.
Timer event: 54ms: Total time spent in AJDE
Timer event: 51ms: Total time spent in AJDE
Timer event: 1ms: Total time spent in AJDE
Timer event: 51ms: Total time spent in AJDE
Timer event: 46ms: Total time spent in AJDE
Timer event: 41ms: Total time spent in AJDE


---

Converting that project to an aspectj project too:

 Timer event: 108ms: Total time spent in AJDE
 Timer event: 0ms: Total time spent in AJDE
 Timer event: 1ms: Total time spent in AJDE
 Timer event: 0ms: Total time spent in AJDE
 Timer event: 0ms: Total time spent in AJDE
 Timer event: 1ms: Total time spent in AJDE
 Timer event: 1ms: Total time spent in AJDE
 Timer event: 1ms: Total time spent in AJDE
 Timer event: 0ms: Total time spent in AJDE
 Timer event: 0ms: Total time spent in AJDE
 Timer event: 0ms: Total time spent in AJDE
 Timer event: 0ms: Total time spent in AJDE
 Timer event: 3ms: Total time spent in AJDE
 Timer event: 1ms: Total time spent in AJDE
 Timer event: 1ms: Total time spent in AJDE
 Timer event: 1ms: Total time spent in AJDE
 Timer event: 1ms: Total time spent in AJDE
 Timer event: 5ms: Total time spent in AJDE

But the AJBuilder times are still ugly:
Timer event: 141ms: Total time spent in AJBuilder.build()
Timer event: 34ms: Total time spent in AJBuilder.build()
Timer event: 44ms: Total time spent in AJBuilder.build()
Timer event: 23ms: Total time spent in AJBuilder.build()
Timer event: 37ms: Total time spent in AJBuilder.build()
Timer event: 183ms: Total time spent in AJBuilder.build()
Timer event: 153ms: Total time spent in AJBuilder.build()
Timer event: 40ms: Total time spent in AJBuilder.build()
Timer event: 77ms: Total time spent in AJBuilder.build()
Timer event: 64ms: Total time spent in AJBuilder.build()
Timer event: 122ms: Total time spent in AJBuilder.build()
Timer event: 263ms: Total time spent in AJBuilder.build()
Timer event: 195ms: Total time spent in AJBuilder.build()
Timer event: 70ms: Total time spent in AJBuilder.build()
Timer event: 3845ms: Total time spent in AJBuilder.build()
Timer event: 83ms: Total time spent in AJBuilder.build()
Timer event: 55ms: Total time spent in AJBuilder.build()

we must get rid of the refresh.

I see two ways to proceed:
- the hard way (and the correct way) - get what we need out of the JDT state object.  Going to be tricky as I might need a callback to AJDT to ask for it because in the compiler I can't just grab it.

- a simpler way that will help but not fix everything.  As we see in the first set of numbers I put in today, we pay a price for encountering a java project.  But we pay the same price each time it is encountered after that - it would be very easy to remember (for that compile only) what we learn for a particular bin folder and not recalculate it each time.  For the numbers above:

Timer event: 54ms: Total time spent in AJDE
Timer event: 51ms: Total time spent in AJDE
Timer event: 1ms: Total time spent in AJDE
Timer event: 51ms: Total time spent in AJDE
Timer event: 46ms: Total time spent in AJDE
Timer event: 41ms: Total time spent in AJDE

it would then be likely that everything after the first 54 will be back down to 0/1.

i might explore the first option a little and if I hit a brick wall for now then switch to the second.  The second seems more achievable for 1.6.4
Comment 33 Andrew Eisenberg CLA 2009-03-19 13:21:33 EDT
I'd like to remove the refresh after build for AJ projects, but it is proving to be more difficult than I had thought.  Bug 101481 describes how a full refresh after build is required when there is a Java project that depends on this AJ project.  Apparently, even with the new finer grained control over refreshes, this is still a necessity.  

Currently, when we only have AJ projects, AJDT is more nuanced with its refreshing.  It tries to only refresh output folders that have changed, but now I think that even this can be disabled due to our better management of file creation.  As Andy suggests, though, this is not necessarily a recommendation to turn everything into an AJ project.  

So, in this scenario, we are seeing these huge refresh times because there are Java projects that depend on your AJ projects.  I think we can optimize this.  So, I will look into this some more.
Comment 34 Andrew Eisenberg CLA 2009-03-19 13:42:55 EDT
Good news.  It seems that AJDT was only doing a refresh when a class file hadn't previously existed.  So, if ajc had deleted and then created a new class file, no refresh would have occurred because Eclipse wasn't aware of the deletion.

So, now I changed things so that when AJDT is notified of a write to a class file, it always refreshes regardless of its previous existance.

Now, dependent Java projects properly see the changed class files.  And I think I can remove the refresh after build.  I still need to do some more testing, but I am confident that this will work.  I may need to tweak the way resources are refreshed.
Comment 35 Andrew Clement CLA 2009-03-19 14:25:35 EDT
adding dependency on bug 269435 since we'll need that map to inspect the state objects for java projects.

The 'quick solution' is harder than I first thought - due to the lifecycle issue. We don't really know when to clear any cached information as builds can be fired off at any time for any reason by the eclipse infrastructure.
Comment 36 Andrew Eisenberg CLA 2009-03-19 23:15:34 EDT
I think AJDT is going to need a new call back for deleted Java files and deleted class files.

There is already:
CoreOutputLocation.reportClassFileWrite

I require something like
CoreOutputLocation.reportClassFileRemove
This should be called when a class file is removed, but not recreated.

Alternatively, if this information is not easy to get, you can just call CoreOutputLocation.reportClassFileRemove for every class file removed and then call reportClassFileWrite for when they are recreated.  I don't think the performance hit would be too bad.
Comment 37 Andrew Clement CLA 2009-03-20 00:15:06 EDT
i will look into that tomorrow
Comment 38 Andrew Eisenberg CLA 2009-03-20 00:51:03 EDT
Thanks.  

I'm also noticing that there seems to be a full build (or at least all class files are recreated) when a source file is deleted or a package is deleted.  Maybe this is supposed to happen, but it does seem inefficient.

Attaching a test project.
Comment 39 Andrew Eisenberg CLA 2009-03-20 01:01:27 EDT
Arrgh.  I was hoping to have a good test case for this, but can't make it fail consistently.  It may have something to do with timestamps and ensuring that they are > 1000ms apart between builds.  

Too tired to look at this now.
Comment 40 Andrew Clement CLA 2009-03-20 02:28:37 EDT
defer that to another bug - raise one to track it. I think the focus on this bug is fast incremental for the mainline case and that is repeated editing and saving whilst working on an existing source file.
Comment 41 Andrew Clement CLA 2009-03-20 13:50:26 EDT
New callback is now implemented in AspectJ (with empty implementation) in AJDT:

reportClassFileRemove()

Comment 42 Andrew Eisenberg CLA 2009-03-20 18:45:10 EDT
Thanks.  However, the reportClassFileRemoved() method must be called after the actual removal occurs.  This way, the call to refreshLocal picks up the change.
Comment 43 Andrew Clement CLA 2009-03-20 19:49:23 EDT
sigh - just the same thing as we had with that other api last time. fix committed.
Comment 44 Andrew Clement CLA 2009-03-21 12:01:54 EDT
*** Bug 249212 has been marked as a duplicate of this bug. ***
Comment 45 Andrew Clement CLA 2009-03-23 17:51:25 EDT
Ok, I'm using the stub implementation API for mapping outputlocation to java project, here are the times with it switched off.

(Time jumps to 23ms when we hit the Java project on the classpath)

Timer event: 160ms: Total time spent in AJDE
Timer event: 0ms: Total time spent in AJDE
Timer event: 0ms: Total time spent in AJDE
Timer event: 0ms: Total time spent in AJDE
Timer event: 1ms: Total time spent in AJDE
Timer event: 1ms: Total time spent in AJDE
Timer event: 1ms: Total time spent in AJDE
Timer event: 1ms: Total time spent in AJDE
Timer event: 0ms: Total time spent in AJDE
Timer event: 1ms: Total time spent in AJDE
Timer event: 1ms: Total time spent in AJDE
Timer event: 23ms: Total time spent in AJDE
Timer event: 24ms: Total time spent in AJDE
Timer event: 2ms: Total time spent in AJDE
Timer event: 28ms: Total time spent in AJDE
Timer event: 1ms: Total time spent in AJDE
Timer event: 23ms: Total time spent in AJDE
Timer event: 23ms: Total time spent in AJDE

Turning on my change:

Timer event: 180ms: Total time spent in AJDE
Timer event: 0ms: Total time spent in AJDE
Timer event: 1ms: Total time spent in AJDE
Timer event: 1ms: Total time spent in AJDE
Timer event: 1ms: Total time spent in AJDE
Timer event: 6ms: Total time spent in AJDE
Timer event: 1ms: Total time spent in AJDE
Timer event: 1ms: Total time spent in AJDE
Timer event: 1ms: Total time spent in AJDE
Timer event: 1ms: Total time spent in AJDE
Timer event: 1ms: Total time spent in AJDE
Timer event: 2ms: Total time spent in AJDE
Timer event: 4ms: Total time spent in AJDE
Timer event: 4ms: Total time spent in AJDE
Timer event: 5ms: Total time spent in AJDE
Timer event: 3ms: Total time spent in AJDE
Timer event: 7ms: Total time spent in AJDE
Timer event: 4ms: Total time spent in AJDE

costs are greatly reduced - the remaining time might be reflection, or the hack I'm doing because I can't quickly determine the project for an output folder.

So, my side of this is complete - and I'll commit it, but it won't spring to life until the AJDT enhancement in bug 269435 is implemented.

At that time I'll do a bit more profiling and testing.
Comment 46 Andrew Clement CLA 2009-03-24 20:06:11 EDT
Thomas - do you have many messages come out of your projects when they build?  By that I mean warnings/todos/etc?  Under bug 269912 I've discovered some code that can slow things down if there are many messages coming out.  It added 20% to compile times for my projects that produce 8000 warning messages (which i keep ignoring...)
Comment 47 Andrew Clement CLA 2009-03-25 13:29:32 EDT
Created attachment 129869 [details]
yourkit profile picture

Just 'fyi' I've attached a yourkit profile of an incremental compile that I just performed.  This is all threads together so possibly some of the marker work done in jobs is shown here.  It may be interesting nevertheless - showing that of the 275seconds (greatly slowed down by a detailed profile run), 40% is in UIBuildListener.postCallListeners(), 29% is in UIBuildListener.preCallListeners() and 27% is actually compiling.  I think it is worth a quick look over the methods it indicates to see if anything can be done smarter (even if that requires further compiler callbacks to help AJDT).
Comment 48 Andrew Clement CLA 2009-03-26 12:37:04 EDT
I am done on the AspectJ side of this now.  I don't plan on doing any more for 1.6.4 but it would be nice to get the remaining two things addressed in AJDT just to make sure the 1.6.4 AspectJ is behaving correctly.  What seems to be remaining:

- removing refresh after build (bug 269604)
- map from output folder to originating java project (bug 269435)

Until the latter one is there, my code to do faster builds for AJ projects depending on Java projects will not activate.

Comment 49 Thomas Hofmann CLA 2009-03-27 05:58:12 EDT
Created attachment 130079 [details]
trace no. 1 with new dev build

Times in AJDT and AJBuilder look much better now. Still we are far away from subsecond times.

Looking at the progress view in eclipse revealse that deleting and creeating the markers takes a long time. This can also be seen at the end of the trace.

Anyway, build times are much faster now. Thank you very much for your work. I really appreciate it. I hope that you might have some ideas on speeding up the marker creation.
Comment 50 Thomas Hofmann CLA 2009-03-27 06:01:42 EDT
Created attachment 130080 [details]
trace no. 2 with new dev build

Now this run was much faster. I don't think any markers were changed although I don't understand why not this time.
Comment 51 Thomas Hofmann CLA 2009-03-27 06:02:53 EDT
Created attachment 130081 [details]
trace no. 3 with new dev build

Also very fast. No markers recreated.
Comment 52 Thomas Hofmann CLA 2009-03-27 06:08:30 EDT
(In reply to comment #51)
> Created an attachment (id=130081) [details]
> trace no. 3 with new dev build
> 
> Also very fast. No markers recreated.
> 

This looks very promising. If bug 268822 were also fixed in 1.6.5 I think our developers would greatly benefit.
Comment 53 Andrew Clement CLA 2009-03-27 11:31:34 EDT
marker creation is happening as a separate job at the end of the build process - so it shouldn't damage your development experience too much as you will be back in control and it will be running in the 'background'.  But I agree it would be nice to get those times lower.

The AJDT refresh times are now zero, but AJDT is still doing something expensive post build.

AJDE times are what I wanted them to be - where there is a >100ms glitch in a downstream build, that may be when a dependency on a Java project is hit and should be addressed when bug 269435 is fixed.

Possibly my yk profile in comment 47 will help determine why AJDT is still having issues.
Comment 54 Andrew Clement CLA 2009-03-27 14:36:14 EDT
tested fix for 269435 - appears to work in my scenario.  Here is the log entry when we hit the java project dependency:

11:30:4 Failed to find a state instance managing output location : F:\workspaces\testws\org.aspectj.ajdt.core\bin
11:30:4 'F:\workspaces\testws\org.aspectj.ajdt.core\bin' is apparently unchanged so not performing timestamp check

So, on a whitespace change to my top level project, here are the AJDE times - great!

 Timer event: 172ms: Total time spent in AJDE
 Timer event: 1ms: Total time spent in AJDE
 Timer event: 1ms: Total time spent in AJDE
 Timer event: 0ms: Total time spent in AJDE
 Timer event: 0ms: Total time spent in AJDE
 Timer event: 1ms: Total time spent in AJDE
 Timer event: 1ms: Total time spent in AJDE
 Timer event: 0ms: Total time spent in AJDE
 Timer event: 1ms: Total time spent in AJDE
 Timer event: 1ms: Total time spent in AJDE
 Timer event: 1ms: Total time spent in AJDE
 Timer event: 1ms: Total time spent in AJDE
 Timer event: 2ms: Total time spent in AJDE
 Timer event: 1ms: Total time spent in AJDE
 Timer event: 2ms: Total time spent in AJDE
 Timer event: 0ms: Total time spent in AJDE
 Timer event: 2ms: Total time spent in AJDE
 Timer event: 2ms: Total time spent in AJDE

Here are the AJBuilder times:
Timer event: 195ms: Total time spent in AJBuilder.build()
Timer event: 16ms: Total time spent in AJBuilder.build()
Timer event: 13ms: Total time spent in AJBuilder.build()
Timer event: 7ms: Total time spent in AJBuilder.build()
Timer event: 17ms: Total time spent in AJBuilder.build()
Timer event: 26ms: Total time spent in AJBuilder.build()
Timer event: 23ms: Total time spent in AJBuilder.build()
Timer event: 31ms: Total time spent in AJBuilder.build()
Timer event: 2ms: Total time spent in AJBuilder.build()
Timer event: 6ms: Total time spent in AJBuilder.build()
Timer event: 10ms: Total time spent in AJBuilder.build()
Timer event: 10ms: Total time spent in AJBuilder.build()
Timer event: 34ms: Total time spent in AJBuilder.build()
Timer event: 5ms: Total time spent in AJBuilder.build()
Timer event: 24ms: Total time spent in AJBuilder.build()
Timer event: 3ms: Total time spent in AJBuilder.build()
Timer event: 6ms: Total time spent in AJBuilder.build()
Timer event: 5ms: Total time spent in AJBuilder.build()
Comment 55 Andrew Eisenberg CLA 2009-03-27 14:48:56 EDT
The remaining time in AJBuilder is spent, I believe, in the sections that look for deltas in the current project and the projects it depends on.

I am adding a bunch more logging statements in the builder code that can help prove this.

If so, there might be some work I can do to get these times down even further.
Comment 56 Andrew Clement CLA 2009-03-27 15:35:52 EDT
i'll lookout for the timers appearing and give you some numbers.
Comment 57 Andrew Clement CLA 2009-03-27 16:37:15 EDT
just timed a project that was showing a build time of 4ms (ajde) then 43ms (ajbuilder) - yourkit says the cost is in 

UIBuildListener.projectAlreadyMarked
75% of it is Resource.findMarkers()
13% of it is Marker.getAttribute(String, int)
10% of it is Marker.getAttribute(String,String)

the data from the log is something like:

13:36:34 ===========================================================================================
13:36:34 Build kind = AUTOBUILD
13:36:34 Project=tests, kind of build requested=Incremental AspectJ compilation
13:36:34 Timer event: 0ms: Flush included source file cache
13:36:34 Timer event: 0ms: Check delta
13:36:34 Timer event: 0ms: Looking for and marking configurartion changes in tests
13:36:34 	Configuration changes found: false
13:36:34 build: Examined delta - no source file or classpath changes for project tests
13:36:34 Timer event: 0ms: Looking for and marking configurartion changes in testing-drivers
13:36:34 	Configuration changes found: false
13:36:34 Timer event: 0ms: Looking for and marking configurartion changes in lib
13:36:34 	Configuration changes found: false
13:36:34 Timer event: 0ms: Looking for and marking configurartion changes in testing
13:36:34 	Configuration changes found: false
13:36:34 Timer event: 0ms: Looking for and marking configurartion changes in org.aspectj.ajdt.core
13:36:34 	Configuration changes found: false
13:36:34 File: F:\workspaces\testws\util\src\org\aspectj\util\FileUtil.java has changed.
13:36:34 build: Examined delta - 1 changed, 0 added, and 0 deleted source files in required project util
13:36:34 Timer event: 0ms: Looking for and marking configurartion changes in util
13:36:34 	Configuration changes found: true
13:36:34 Timer event: 55ms: Look for source/resource changes
13:36:34 Setting list of classpath elements with modified contents:
13:36:34       [F:/workspaces/testws/testing-drivers/bin, F:/workspaces/testws/lib/commons/commons.jar, F:/workspaces/testws/testing/bin, F:/workspaces/testws/util/bin, F:/workspaces/testws/bridge/bin, F:/workspaces/testws/util/bin, F:/workspaces/testws/bridge/bin, F:/workspaces/testws/asm/bin, F:/workspaces/testws/org.aspectj.ajdt.core/bin, F:/workspaces/testws/org.eclipse.jdt.core/jdtcore-for-aspectj.jar, F:/workspaces/testws/ajde.core/bin, F:/workspaces/testws/asm/bin, F:/workspaces/testws/weaver/bin, F:/workspaces/testws/testing-util/bin, F:/workspaces/testws/org.aspectj.matcher/bin]
13:36:34 Classpath = F:\workspaces\testws\tests\bin;F:\workspaces\testws\testing-drivers\bin;F:/workspaces/testws/lib/junit/junit.jar;F:\workspaces\testws\testing\bin;F:/workspaces/testws/lib/commons/commons.jar;F:\workspaces\testws\org.aspectj.ajdt.core\bin;F:\workspaces\testws\util\bin;F:\workspaces\testws\bridge\bin;F:\workspaces\testws\ajde.core\bin;F:\workspaces\testws\asm\bin;F:/workspaces/testws/org.eclipse.jdt.core/jdtcore-for-aspectj.jar;F:/workspaces/testws/lib/bcel/bcel.jar;F:/workspaces/testws/lib/ant/lib/ant-launcher.jar;F:\workspaces\testws\weaver\bin;F:\workspaces\testws\testing-util\bin;F:/workspaces/testws/lib/bcel/bcel-verifier.jar;E:/jvms/jdk1.6.0_06/jre/lib/resources.jar;E:/jvms/jdk1.6.0_06/jre/lib/rt.jar;E:/jvms/jdk1.6.0_06/jre/lib/jsse.jar;E:/jvms/jdk1.6.0_06/jre/lib/jce.jar;E:/jvms/jdk1.6.0_06/jre/lib/charsets.jar;E:/jvms/jdk1.6.0_06/jre/lib/ext/dnsns.jar;E:/jvms/jdk1.6.0_06/jre/lib/ext/localedata.jar;E:/jvms/jdk1.6.0_06/jre/lib/ext/sunjce_provider.jar;E:/jvms/jdk1.6.0_06/jre/lib/ext/sunmscapi.jar;E:/jvms/jdk1.6.0_06/jre/lib/ext/sunpkcs11.jar;F:\workspaces\testws\org.aspectj.matcher\bin;F:/workspaces/aspectj16_2/org.aspectj.runtime/aspectjrt.jar;
13:36:34 Timer event: 102ms: Pre compile
13:36:34 Sending the following configuration changes to the compiler: []
13:36:34 0 source file changes since last build
13:36:34 Compiler configuration for project tests has been read by compiler.  Resetting.
13:36:34      Configuration was []
13:36:34 Resetting list of modified source files.  Was []
13:36:34 Found state instance managing output location : F:\workspaces\testws\testing-drivers\bin
13:36:34 No reported changes in that state
13:36:34 Found state instance managing output location : F:\workspaces\testws\testing\bin
13:36:34 No reported changes in that state
13:36:34 Found state instance managing output location : F:\workspaces\testws\util\bin
13:36:34 No reported changes in that state
13:36:34 Found state instance managing output location : F:\workspaces\testws\bridge\bin
13:36:34 No reported changes in that state
13:36:34 Found state instance managing output location : F:\workspaces\testws\util\bin
13:36:34 No reported changes in that state
13:36:34 Found state instance managing output location : F:\workspaces\testws\bridge\bin
13:36:34 No reported changes in that state
13:36:34 Found state instance managing output location : F:\workspaces\testws\asm\bin
13:36:34 No reported changes in that state
13:36:34 Failed to find a state instance managing output location : F:\workspaces\testws\org.aspectj.ajdt.core\bin
13:36:34 'F:\workspaces\testws\org.aspectj.ajdt.core\bin' is apparently unchanged so not performing timestamp check
13:36:34 Found state instance managing output location : F:\workspaces\testws\ajde.core\bin
13:36:34 No reported changes in that state
13:36:34 Found state instance managing output location : F:\workspaces\testws\asm\bin
13:36:34 No reported changes in that state
13:36:34 Found state instance managing output location : F:\workspaces\testws\weaver\bin
13:36:34 No reported changes in that state
13:36:34 Found state instance managing output location : F:\workspaces\testws\testing-util\bin
13:36:34 No reported changes in that state
13:36:34 Found state instance managing output location : F:\workspaces\testws\org.aspectj.matcher\bin
13:36:34 No reported changes in that state
13:36:34 Preparing for build: planning to be an incremental build
13:36:34 AspectJ reports build successful, build was: INCREMENTAL
13:36:34 AJDE Callback: finish. Was full build: false
13:36:34 Timer event: 3ms: Total time spent in AJDE
13:36:34 Timer event: 0ms: Refresh after build
13:36:34 Timer event: 106ms: Total time spent in AJBuilder.build()
13:36:34 ===========================================================================================
Comment 58 Andrew Eisenberg CLA 2009-03-27 17:30:32 EDT
Doesn't surprise me that the findMarkers() is taking so long.  It is doing a search for the markers at an infinite depth (ie- it trawls the whole project).  I really don't understand why the infinite depth is specified.  Seems to me that it should only be a depth of 0 (ie- the project resource itself).

If I search only to a depth of 0, then these times below should be significantly reduced.  But, I don't know what other consequences it will have.



(In reply to comment #57)
> UIBuildListener.projectAlreadyMarked
> 75% of it is Resource.findMarkers()
> 13% of it is Marker.getAttribute(String, int)
> 10% of it is Marker.getAttribute(String,String)
Comment 59 Andrew Eisenberg CLA 2009-03-27 17:50:08 EDT
OK.  Just committed a new UIBuildListener where IResource.DEPTH_INFINITE is replaced with IResource.DEPTH_ZERO for marking and unmarking projects.  Can you try this out to see fi it works better for you?
Comment 60 Andrew Clement CLA 2009-03-27 18:19:21 EDT
Yes, it is faster with that change in:

15:18:11 Build kind = AUTOBUILD
15:18:11 Project=tests, kind of build requested=Incremental AspectJ compilation
15:18:11 Timer event: 0ms: Flush included source file cache
15:18:11 Timer event: 0ms: Check delta
15:18:11 Timer event: 0ms: Looking for and marking configurartion changes in tests
15:18:11 	Configuration changes found: false
15:18:11 build: Examined delta - no source file or classpath changes for project tests
15:18:11 Timer event: 0ms: Looking for and marking configurartion changes in testing-drivers
15:18:11 	Configuration changes found: false
15:18:11 Timer event: 0ms: Looking for and marking configurartion changes in lib
15:18:11 	Configuration changes found: false
15:18:11 Timer event: 0ms: Looking for and marking configurartion changes in testing
15:18:11 	Configuration changes found: false
15:18:11 Timer event: 0ms: Looking for and marking configurartion changes in org.aspectj.ajdt.core
15:18:11 	Configuration changes found: false
15:18:11 File: F:\workspaces\testws\util\src\org\aspectj\util\FileUtil.java has changed.
15:18:11 build: Examined delta - 1 changed, 0 added, and 0 deleted source files in required project util
15:18:11 Timer event: 0ms: Looking for and marking configurartion changes in util
15:18:11 	Configuration changes found: true
15:18:11 Timer event: 1ms: Look for source/resource changes
15:18:11 Setting list of classpath elements with modified contents:
15:18:11       [F:/workspaces/testws/testing-drivers/bin, F:/workspaces/testws/lib/commons/commons.jar, F:/workspaces/testws/testing/bin, F:/workspaces/testws/util/bin, F:/workspaces/testws/bridge/bin, F:/workspaces/testws/util/bin, F:/workspaces/testws/bridge/bin, F:/workspaces/testws/asm/bin, F:/workspaces/testws/org.aspectj.ajdt.core/bin, F:/workspaces/testws/org.eclipse.jdt.core/jdtcore-for-aspectj.jar, F:/workspaces/testws/ajde.core/bin, F:/workspaces/testws/asm/bin, F:/workspaces/testws/weaver/bin, F:/workspaces/testws/testing-util/bin, F:/workspaces/testws/org.aspectj.matcher/bin]
15:18:11 Classpath = F:\workspaces\testws\tests\bin;F:\workspaces\testws\testing-drivers\bin;F:/workspaces/testws/lib/junit/junit.jar;F:\workspaces\testws\testing\bin;F:/workspaces/testws/lib/commons/commons.jar;F:\workspaces\testws\org.aspectj.ajdt.core\bin;F:\workspaces\testws\util\bin;F:\workspaces\testws\bridge\bin;F:\workspaces\testws\ajde.core\bin;F:\workspaces\testws\asm\bin;F:/workspaces/testws/org.eclipse.jdt.core/jdtcore-for-aspectj.jar;F:/workspaces/testws/lib/bcel/bcel.jar;F:/workspaces/testws/lib/ant/lib/ant-launcher.jar;F:\workspaces\testws\weaver\bin;F:\workspaces\testws\testing-util\bin;F:/workspaces/testws/lib/bcel/bcel-verifier.jar;E:/jvms/jdk1.6.0_06/jre/lib/resources.jar;E:/jvms/jdk1.6.0_06/jre/lib/rt.jar;E:/jvms/jdk1.6.0_06/jre/lib/jsse.jar;E:/jvms/jdk1.6.0_06/jre/lib/jce.jar;E:/jvms/jdk1.6.0_06/jre/lib/charsets.jar;E:/jvms/jdk1.6.0_06/jre/lib/ext/dnsns.jar;E:/jvms/jdk1.6.0_06/jre/lib/ext/localedata.jar;E:/jvms/jdk1.6.0_06/jre/lib/ext/sunjce_provider.jar;E:/jvms/jdk1.6.0_06/jre/lib/ext/sunmscapi.jar;E:/jvms/jdk1.6.0_06/jre/lib/ext/sunpkcs11.jar;F:\workspaces\testws\org.aspectj.matcher\bin;F:/workspaces/aspectj16_2/org.aspectj.runtime/aspectjrt.jar;
15:18:11 Timer event: 2ms: Pre compile
15:18:11 Sending the following configuration changes to the compiler: []
15:18:11 0 source file changes since last build
15:18:11 Compiler configuration for project tests has been read by compiler.  Resetting.
15:18:11      Configuration was []
15:18:11 Resetting list of modified source files.  Was []
15:18:11 Found state instance managing output location : F:\workspaces\testws\testing-drivers\bin
15:18:11 No reported changes in that state
15:18:11 Found state instance managing output location : F:\workspaces\testws\testing\bin
15:18:11 No reported changes in that state
15:18:11 Found state instance managing output location : F:\workspaces\testws\util\bin
15:18:11 No reported changes in that state
15:18:11 Found state instance managing output location : F:\workspaces\testws\bridge\bin
15:18:11 No reported changes in that state
15:18:11 Found state instance managing output location : F:\workspaces\testws\util\bin
15:18:11 No reported changes in that state
15:18:11 Found state instance managing output location : F:\workspaces\testws\bridge\bin
15:18:11 No reported changes in that state
15:18:11 Found state instance managing output location : F:\workspaces\testws\asm\bin
15:18:11 No reported changes in that state
15:18:11 Failed to find a state instance managing output location : F:\workspaces\testws\org.aspectj.ajdt.core\bin
15:18:11 'F:\workspaces\testws\org.aspectj.ajdt.core\bin' is apparently unchanged so not performing timestamp check
15:18:11 Found state instance managing output location : F:\workspaces\testws\ajde.core\bin
15:18:11 No reported changes in that state
15:18:11 Found state instance managing output location : F:\workspaces\testws\asm\bin
15:18:11 No reported changes in that state
15:18:11 Found state instance managing output location : F:\workspaces\testws\weaver\bin
15:18:11 No reported changes in that state
15:18:11 Found state instance managing output location : F:\workspaces\testws\testing-util\bin
15:18:11 No reported changes in that state
15:18:11 Found state instance managing output location : F:\workspaces\testws\org.aspectj.matcher\bin
15:18:11 No reported changes in that state
15:18:11 Preparing for build: planning to be an incremental build
15:18:11 AspectJ reports build successful, build was: INCREMENTAL
15:18:11 AJDE Callback: finish. Was full build: false
15:18:11 Timer event: 2ms: Total time spent in AJDE
15:18:11 Timer event: 0ms: Refresh after build
15:18:11 Timer event: 5ms: Total time spent in AJBuilder.build()

----

but is it a safe change? What markers is it looking for and are they only ever found on the top most element?
Comment 61 Andrew Eisenberg CLA 2009-03-27 18:54:39 EDT
(In reply to comment #60)
> but is it a safe change? What markers is it looking for and are they only ever
> found on the top most element?
> 
Yes.  The markers are only added to the top-most (project) resource.  These markers are used to determine if there was a failure during the previous build (eg- build was canceled or there was a compiler error, etc).  

The particular snippet of code checks to see if any depending projects have been marked as failed with a rebuild required.  If so, then this project is marked the same.  So, it is safe to change the depth.  

This is a part of the code that I have not looked at yet and it does seem to require a bit of refactoring.  I may do so later.
Comment 62 Andrew Clement CLA 2009-03-27 20:18:19 EDT
that is great news.  sounds like we are pretty much wrapped up on this issue then.

Comment 63 Andrew Clement CLA 2009-03-30 12:56:12 EDT
all work completed for this bug.
Comment 64 Thomas Hofmann CLA 2009-03-30 15:52:25 EDT
>
> This is a part of the code that I have not looked at yet and it does seem to
> require a bit of refactoring.  I may do so later.
>

Did you do this refactoring and check in some changes? When will this be available in a dev build?

Thanks. 

Comment 65 Andrew Eisenberg CLA 2009-03-30 17:40:56 EDT
(In reply to comment #64)
> 
> Did you do this refactoring and check in some changes? When will this be
> available in a dev build?
> 
> Thanks. 
> 

These changes are currently available in the latest dev build.  Further refactorings will likely be covered by a different bug.
Comment 66 Neale Upstone CLA 2009-04-01 06:48:30 EDT
I've just noticed this in my day to day work.

I have a JDT base project that my AJDT project depends on.

If I change a file that isn't woven in the base, I get a very quick build and no re-weaving.

If I change one that is woven, it falls back to a full build.

This works beautifully for me, as the woven stuff is files I can only do bug fixes to.

Nice work!