RFR: JDK-8146403: Windows build can be faster

Magnus Ihse Bursie magnus.ihse.bursie at oracle.com
Thu Jan 14 11:07:14 UTC 2016

On 2016-01-14 12:01, Erik Joelsson wrote:
> 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.
Alright, I didn't see those includes. Sounds good then. Ship it! :)


> /Erik
>> /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