RFR: JDK-8146403: Windows build can be faster

Erik Joelsson erik.joelsson at oracle.com
Thu Jan 14 11:01:06 UTC 2016

On 2016-01-14 11:53, Magnus Ihse Bursie wrote:
> On 2016-01-14 11:43, Erik Joelsson wrote:
>> Hello,
>> Thinking more about the new bootstrap logic, I feel that I don't like 
>> the solution. Here is a new patch where I only changed that part. I 
>> reverted to using the -include mechanism to trigger generation of 
>> module-deps.gmk, but still in a separate makefile that is only 
>> included by Main.gmk.
>> Webrev: http://cr.openjdk.java.net/~erikj/8146403/webrev.03/
> It looks like this version is just like the original, but you have 
> moved some code from Modules.gmk to GenerateModuleDeps.gmk, but since 
> both of them is included in Main.gmk, there will be no functional 
> changes, just a matter of code cleanup. Or am I missing something?
> I'm not saying it's bad, I just understand how and if this resolves 
> what you set out to solve in your first version.
Modules.gmk is included in many places. Each such instance would have to 
evaluate if module-deps.gmk needed to be recreated or not, and in turn 
run a find over the source files for the generator tool. This is now 
only done in Main.gmk.

> /Magnus
>> /Erik
>> On 2016-01-13 14:44, Erik Joelsson wrote:
>>> Hello,
>>> New webrev: http://cr.openjdk.java.net/~erikj/8146403/webrev.02/
>>> Fixed the below comments. Also adjusted some more gensrc log output 
>>> to make it more uniform, even if it doesn't exactly address Windows 
>>> performance.
>>> I also fixed a bug in the bootstrap make logic. The module-deps.gmk 
>>> wasn't correctly generated in all cases. Typically when building 
>>> more than one conf at a time or when doing a compare build. I added 
>>> explicit calls to GenerateModuleDeps.gmk to fix this.
>>> /Erik
>>> On 2016-01-13 12:48, Magnus Ihse Bursie wrote:
>>>> Hi,
>>>> In InitSupport.gmk, please restore the comment:
>>>>  # Only do this if make has not been restarted, and if we do not 
>>>> force it.
>>>> In jdk/make/gensrc/GensrcExceptions.gmk:
>>>> The old construct resulted in the output "Generating exceptions 
>>>> classes" (but a bit irregularly), could you please re-add it as a 
>>>> LogInfo?
>>>> In make/CompileTools.gmk, the copyright header says 2014, which is 
>>>> at least one year too early. :-) (In fact, all modified files 
>>>> should really get bumped to 2016).
>>>> Apart from this, it looks good to me.
>>>> /Magnus
>>>> On 2016-01-05 11:58, Erik Joelsson wrote:
>>>>> Hello,
>>>>> During the hotspot makefile conversion, we have been reminded of 
>>>>> inefficiencies when running make in Cygwin. We still have a pretty 
>>>>> severe performance regression in the new hotspot build compared to 
>>>>> the old on Windows in certain situations, my laptop being one such 
>>>>> situation. A recent comparison there between just the old and new 
>>>>> hotspot build:
>>>>> release new 00:04:30
>>>>> release old 00:03:10
>>>>> fastdebug new 00:04:59
>>>>> fastdebug old 00:03:37
>>>>> Much of the extra time is spent spawning various shell processes 
>>>>> for book keeping, like saving failure logs, creating header 
>>>>> dependency files etc.
>>>>> It also takes a very long time to do a "do nothing" rebuild when 
>>>>> nothing has changed. On my laptop, repeating "make jimages" often 
>>>>> takes as long as 40 seconds to figure out that nothing needs to be 
>>>>> rebuilt. In this case there are several culprits.
>>>>> I have been working on improvements in these areas to reduce the 
>>>>> overhead. The "do nothing" rebuild of jimages is down to around 25 
>>>>> seconds. A full images build is around 1-2 minutes faster from 24 
>>>>> to 22 minutes, but fluctuates quite a bit. The new hotspot build 
>>>>> is also improved:
>>>>> release: 3:44
>>>>> fastdebug: 4:02
>>>>> Here is a list of the kinds of changes I've made:
>>>>> * Rewrote logger.sh to use a different construct. It drastically 
>>>>> reduces the number of bash processes being spawned. Basically you 
>>>>> can pipe like this: "> >(tee logfile) 2> >(tee logfile >&2)". I 
>>>>> also managed to reduce the extra sed/grep commands needed for the 
>>>>> header dependencies even more. A side effect of this is that the 
>>>>> log files for each native compilation unit are always saved 
>>>>> instead of being deleted on successful compilation. I see no issue 
>>>>> with this.
>>>>> * Changed all recipes that contain echo for logging to instead use 
>>>>> new LogInfo macro, which in turn calls $(info ) if appropriate.
>>>>> * Changed all recipes that contain mkdir to instead use MakeDir 
>>>>> macro, which only executes mkdir if the directory doesn't exist.
>>>>> * In HotspotWrapper.gmk there is an optimization to avoid calling 
>>>>> the hotspot makefiles at all if nothing has changed. This runs a 
>>>>> find over the whole hotspot repository. I reduced this to only run 
>>>>> over src and make sub dirs to avoid the pretty large test dir 
>>>>> (since test/closed has grown quite a bit).
>>>>> * Split Tools.gmk into CompileTools.gmk and Tools.gmk, to avoid 
>>>>> having the buildtools compilation being reevaluated by all 
>>>>> makefiles needing the tools definitions.
>>>>> * Split Modules.gmk to avoid having the module deps generation 
>>>>> being reevaluated multiple times. Made the new 
>>>>> GenerateModuleDeps.gmk an explicit call from Init.gmk.
>>>>> Since these improvements affect much more than just the new 
>>>>> hotspot build, I intend to push this to JDK 9 directly.
>>>>> Bug: https://bugs.openjdk.java.net/browse/JDK-8146403
>>>>> Webrev: http://cr.openjdk.java.net/~erikj/8146403/webrev.01/
>>>>> /Erik

More information about the build-dev mailing list