On 06 September 2012, Chris BeHanna said:
>       :nod:
> 
>       That performance hit is why $EMPLOYER is abandoning SCons.  :-(

OT: mind if I ask what they/you are switching to? I've spent the last
day learning tup, and it has given me some interesting ideas. Curious
what else is out there that people are adopting.

> > However, something valuable is lost when you simplify dependencies so
> > dramatically. Specifically, I implemented incremental testing, which
> > was a win, but not nearly as much of a win as it could have been. E.g.
> > if you modify a source file in a low-level component that everything
> > else depends on, then you end up recompiling the world (no big deal:
> > javac is fast enough), and re-running all the tests (not nice: the
> > whole test suite is 20-30 min).
> 

> Can the tests be broken down to a per-jar basis?  If so, and if you
> can identify the jar or jars that changed, then you only run the tests
> for the jars that changed.

Oops, I overstated things for dramatic purposes. In fact, in the end I
had something that works pretty much as you described. Here's a
simplified version of how things looked:

  common-main.jar:
    com/example/utils/StringUtils.class
    com/example/utils/DateUtils.class
  common-test.jar:
    com/example/utils/TestStringUtils.class
    com/example/utils/TestDateUtils.class

  guilibs-main.jar:
    com/example/swingutils/CustomTable.class
  guilibs-test.jar:
    com/example/swingutils/TestCustomTable.class

  bigapp-main.jar:
    com/example/bigapp/ApplicationLogic.class
  bigapp-test.jar:
    com/example/bigapp/TestApplicationLogic.class

(Expand that to 75-80 jar files and ~20,000 .class files to get a feel
for how things really looked.)

The DAG looks like this:

  bigapp-test.jar : source/test/com/example/bigapp/TestApplicationLogic.java
                    guilibs-main.jar
                    common-main.jar
                    junit.jar
                    javac
                    jar
  bigapp-main.jar : source/test/com/example/bigapp/ApplicationLogic.java
                    guilibs-main.jar
                    common-main.jar
                    javac
                    jar

No .class files, just as you suggested: that's the sausage. The build
action is [Remove(classdir), Mkdir(classdir), javac -d classdir, jar].

So if I modify ApplicationLogic.java, here's what SCons does:

  ApplicationLogic.java changed:
    javac + jar to rebuild bigapp-main.jar
  bigapp-main.jar changed:
    javac + jar to rebuild bigapp-test.jar
  bigapp-test.jar changed:
    run com.example.bigapp.TestApplicationLogic
    touch runtests/com.example.bigapp.TestApplicationLogic.stamp

Fine so far, right? Now what happens if I modify DateUtils.java?

  DateUtils.java changed:
    javac + jar to rebuild common-main.jar
  common-main.jar changed:
    javac + jar to rebuild common-test.jar
    javac + jar to rebuild guilibs-main.jar
    javac + jar to rebuild bigapp-main.jar
    run com.example.utils.TestDateUtils
    touch runtests/com.example.utils.TestDateUtil.stamp
    run com.example.utils.TestStringUtils
    touch runtests/com.example.utils.TestStringUtils.stamp

So you can see that TestStringUtils is run unnnecessarily. When you
modify a component with 3000 classes and 1000 tests, that's a lot of
unnnecessary test runs.

(No, we should not have had components with 3000 classes in them. I'd
say it was legacy code, but some of that code was brand new. *sigh*)

       Greg
-- 
Greg Ward                                http://www.gerg.ca/
Any priest or shaman must be presumed guilty until proven innocent.
_______________________________________________
Scons-dev mailing list
Scons-dev@scons.org
http://two.pairlist.net/mailman/listinfo/scons-dev

Reply via email to