On 06. 05. 20 19:23, Jonathan Gibbons wrote:
You could refine the imports by filtering them according to whether they
are 'star-imports' or the simple name matches a simple name that has
been seen by the TreeScanner. In other words, try and filter out
imports that are definitely not relevant.
Good idea. I've tried to do that, and also fixed some bugs in the AST
hashing, and enhanced tests.
All is still on "jlahoda-depend-in-module" branch in jdk/sandbox.
Jan
-- Jon
On 5/6/20 9:49 AM, Jan Lahoda wrote:
Hi Jon,
Good question. I was first experimenting with hashing Elements, as we
do currently for the module API hashes, but it was too slow to enter
the sources (although it is not completely impossible). So I did a new
hashing based on the AST - basically, it is a TreeScanner sending Tree
kinds, names and sub-trees into a MessageDigest. It ignores things
like method bodies, class initializers, and private class members.
Does not currently skip imports, although that may be seen as too
conservative. But tweaks to the AST hashing are surely still needed,
so we can tweak the exact meaning of a "significant change".
Jan
On 06. 05. 20 18:07, Jonathan Gibbons wrote:
Jan,
This seems like an interesting approach.
How are you determining "significant change"? I could imagine trying
to do this by looking at the changed lines, to see if they only
within method bodies and comments (for example), or by doing some
sort of lexical hash on the signatures, assuming that folk aren't
messing with imports to change the resolution of simple type names in
the signature.
-- Jon
On 5/6/20 8:30 AM, Jan Lahoda wrote:
Hi,
Triggered by Magnus' recent e-mail on adjusting the location of the
IDE files, I looked at possibilities to improve speed of incremental
compilation using make. About 3 years ago, we have sped up
incremental build by only rebuilding modules when API of modules
they depend on changed. But the module which contains modified
sources is always compiled in full. So, for changes in java.base,
this change improved the incremental build time significantly (by
not recompiling e.g. java.desktop), but it can still take many
seconds to build java.base after a trivial change. So, this time, I
am thinking of speeding up module builds by not rebuilding all the
source if possible.
What I am thinking of is a relatively simple approach: detect
changed files in a module and check if their "interface" changed. If
it did, recompile the whole module. If it didn't, only compile the
modified files. As a consequence, a small change inside a method
body should lead to a fast build. Changes outside of method bodies
may trigger longer build, but my hope would be that these would be
less common.
So far, I unfortunately don't know how to efficiently do this as
nicely as the API digests used for inter-module dependencies. The
approach that seems might work is this: the Depend plugin hooks
itself into javac internals, and filters the incoming files - it
first parses the modified ones, and if it cannot find a significant
change, it will throw away the unmodified files, and only compile
the modified ones. (In principle, it could also do dependency
analysis, if we at some point decide it is important.)
For a simple "touch Object.java && make", the wall-clock time is
less then 5s, which sounds interesting:
---
$ touch src/java.base/share/classes/java/lang/Object.java && time make
Building target 'default (exploded-image)' in configuration
'linux-x86_64-server-release'
Compiling 3028 files for java.base
Stopping sjavac server
Finished building target 'default (exploded-image)' in configuration
'linux-x86_64-server-release'
real 0m3,104s
user 0m5,731s
sys 0m1,086s
---
My current prototype is in the jdk/sandbox repository, branch
"jlahoda-depend-in-module":
http://hg.openjdk.java.net/jdk/sandbox/shortlog/jlahoda-depend-in-module
I wonder if this would sound interesting to developers working on
base modules, like java.base.
What do you think? Any ideas/feedback?
Thanks,
Jan