Stop using precompiled headers for Linux?

Magnus Ihse Bursie magnus.ihse.bursie at
Fri Nov 2 10:39:53 UTC 2018

On 2018-11-02 00:53, Ioi Lam wrote:
> Maybe precompiled.hpp can be periodically (weekly?) updated by a 
> robot, which parses the dependencies files generated by gcc, and pick 
> the most popular N files?
I think that's tricky to implement automatically. However, I've done 
more or less, that, and I've got some wonderful results! :-)

I'd still like to run some more tests, but preliminiary data indicates 
that there is much to be gained by having a more sensible list of files 
in the precompiled header.

The fewer files we got on this list, the less likely it is to become 
(drastically) outdated. So I don't think we need to do this 
automatically, but perhaps manually every now and then when we feel 
build times are increasing.


> - Ioi
> On 11/1/18 4:38 PM, David Holmes wrote:
>> It's not at all obvious to me that the way we use PCH is the 
>> right/best way to use it. We dump every header we think it would be 
>> good to precompile into precompiled.hpp and then only ask gcc to 
>> precompile it. That results in a ~250MB file that has to be read into 
>> and processed for every source file! That doesn't seem very efficient 
>> to me.
>> Cheers,
>> David
>> On 2/11/2018 3:18 AM, Erik Joelsson wrote:
>>> Hello,
>>> My point here, which wasn't very clear, is that Mac and Linux seem 
>>> to lose just as much real compile time. The big difference in these 
>>> tests was rather the number of cpus in the machine (32 threads in 
>>> the linux box vs 8 on the mac). The total amount of work done was 
>>> increased when PCH was disabled, that's the user time. Here is my 
>>> theory on why the real (wall clock) time was not consistent with 
>>> user time between these experiments can be explained:
>>> With pch the time line (simplified) looks like this:
>>> 1. Single thread creating PCH
>>> 2. All cores compiling C++ files
>>> When disabling pch it's just:
>>> 1. All cores compiling C++ files
>>> To gain speed with PCH, the time spent in 1 much be less than the 
>>> time saved in 2. The potential time saved in 2 goes down as the 
>>> number of cpus go up. I'm pretty sure that if I repeated the 
>>> experiment on Linux on a smaller box (typically one we use in CI), 
>>> the results would look similar to Macosx, and similarly, if I had 
>>> access to a much bigger mac, it would behave like the big Linux box. 
>>> This is why I'm saying this should be done for both or none of these 
>>> platforms.
>>> In addition to this, the experiment only built hotspot. If you we 
>>> would instead build the whole JDK, then the time wasted in 1 in the 
>>> PCH case would be negated to a large extent by other build targets 
>>> running concurrently, so for a full build, PCH is still providing 
>>> value.
>>> The question here is that if the value of PCH isn't very big, 
>>> perhaps it's not worth it if it's also creating as much grief as 
>>> described here. There is no doubt that there is value however. And 
>>> given the examination done by Magnus, it seems this value could be 
>>> increased.
>>> The main reason why we haven't disabled PCH in CI before this. We 
>>> really really want to get CI builds fast. We don't have a ton of 
>>> over capacity to just throw at it. PCH made builds faster, so we 
>>> used them. My other reason is consistency between builds. Supporting 
>>> multiple different modes of building creates the potential for 
>>> inconsistencies. For that reason I would definitely not support 
>>> having PCH on by default, but turned off in our CI/dev-submit. We 
>>> pick one or the other as the official build configuration, and we 
>>> stick with the official build configuration for all builds of any 
>>> official capacity (which includes CI).
>>> In the current CI setup, we have a bunch of tiers that execute one 
>>> after the other. The jdk-submit currently only runs tier1. In tier2 
>>> I've put slowdebug builds with PCH disabled, just to help verify a 
>>> common developer configuration. These builds are not meant to be 
>>> used for testing or anything like that, they are just run for 
>>> verification, which is why this is ok. We could argue that it would 
>>> make sense to move the linux-x64-slowdebug without pch build to 
>>> tier1 so that it's included in dev-submit.
>>> /Erik
>>> On 2018-11-01 03:38, Magnus Ihse Bursie wrote:
>>>> On 2018-10-31 00:54, Erik Joelsson wrote:
>>>>> Below are the corresponding numbers from a Mac, (Mac Pro (Late 
>>>>> 2013), 3.7 GHz, Quad-Core Intel Xeon E5, 16 GB). To be clear, the 
>>>>> -npch is without precompiled headers. Here we see a slight 
>>>>> degradation when disabling on both user time and wall clock time. 
>>>>> My guess is that the user time increase is about the same, but 
>>>>> because of a lower cpu count, the extra load is not as easily 
>>>>> covered.
>>>>> These tests were run with just building hotspot. This means that 
>>>>> the precompiled header is generated alone on one core while 
>>>>> nothing else is happening, which would explain this degradation in 
>>>>> build speed. If we were instead building the whole product, we 
>>>>> would see a better correlation between user and real time.
>>>>> Given the very small benefit here, it could make sense to disable 
>>>>> precompiled headers by default for Linux and Mac, just as we did 
>>>>> with ccache.
>>>>> I do know that the benefit is huge on Windows though, so we cannot 
>>>>> remove the feature completely. Any other comments?
>>>> Well, if you show that it is a loss in time on macosx to disable 
>>>> precompiled headers, and no-one (as far as I've seen) has 
>>>> complained about PCH on mac, then why not keep them on as default 
>>>> there? That the gain is small is no argument to lose it. (I 
>>>> remember a time when you were hunting seconds in the build time ;-))
>>>> On linux, the story seems different, though. People experience PCH 
>>>> as a problem, and there is a net loss of time, at least on selected 
>>>> testing machines. It makes sense to turn it off as default, then.
>>>> /Magnus
>>>>> /Erik
>>>>> macosx-x64
>>>>> real     4m13.658s
>>>>> user     27m17.595s
>>>>> sys     2m11.306s
>>>>> macosx-x64-npch
>>>>> real     4m27.823s
>>>>> user     30m0.434s
>>>>> sys     2m18.669s
>>>>> macosx-x64-debug
>>>>> real     5m21.032s
>>>>> user     35m57.347s
>>>>> sys     2m20.588s
>>>>> macosx-x64-debug-npch
>>>>> real     5m33.728s
>>>>> user     38m10.311s
>>>>> sys     2m27.587s
>>>>> macosx-x64-slowdebug
>>>>> real     3m54.439s
>>>>> user     25m32.197s
>>>>> sys     2m8.750s
>>>>> macosx-x64-slowdebug-npch
>>>>> real     4m11.987s
>>>>> user     27m59.857s
>>>>> sys     2m18.093s
>>>>> On 2018-10-30 14:00, Erik Joelsson wrote:
>>>>>> Hello,
>>>>>> On 2018-10-30 13:17, Aleksey Shipilev wrote:
>>>>>>> On 10/30/2018 06:26 PM, Ioi Lam wrote:
>>>>>>>> Is there any advantage of using precompiled headers on Linux?
>>>>>>> I have measured it recently on shenandoah repositories, and 
>>>>>>> fastdebug/release build times have not
>>>>>>> improved with or without PCH. Actually, it gets worse when you 
>>>>>>> touch a single header that is in PCH
>>>>>>> list, and you end up recompiling the entire Hotspot. I would be 
>>>>>>> in favor of disabling it by default.
>>>>>> I just did a measurement on my local workstation (2x8 cores x2 ht 
>>>>>> Ubuntu 18.04 using Oracle devkit GCC 7.3.0). I ran "time make 
>>>>>> hotspot" with clean build directories.
>>>>>> linux-x64:
>>>>>> real    4m6.657s
>>>>>> user    61m23.090s
>>>>>> sys    6m24.477s
>>>>>> linux-x64-npch
>>>>>> real    3m41.130s
>>>>>> user    66m11.824s
>>>>>> sys    4m19.224s
>>>>>> linux-x64-debug
>>>>>> real    4m47.117s
>>>>>> user    75m53.740s
>>>>>> sys    8m21.408s
>>>>>> linux-x64-debug-npch
>>>>>> real    4m42.877s
>>>>>> user    84m30.764s
>>>>>> sys    4m54.666s
>>>>>> linux-x64-slowdebug
>>>>>> real    3m54.564s
>>>>>> user    44m2.828s
>>>>>> sys    6m22.785s
>>>>>> linux-x64-slowdebug-npch
>>>>>> real    3m23.092s
>>>>>> user    55m3.142s
>>>>>> sys    4m10.172s
>>>>>> These numbers support your claim. Wall clock time is actually 
>>>>>> increased with PCH enabled, but total user time is decreased. 
>>>>>> Does not seem worth it to me.
>>>>>>>> It's on by default and we keep having
>>>>>>>> breakage where someone would forget to add #include. The latest 
>>>>>>>> instance is JDK-8213148.
>>>>>>> Yes, we catch most of these breakages in CIs. Which tells me 
>>>>>>> adding it to jdk-submit would cover
>>>>>>> most of the breakage during pre-integration testing.
>>>>>> jdk-submit is currently running what we call "tier1". We do have 
>>>>>> builds of Linux slowdebug with precompiled headers disabled in 
>>>>>> tier2. We also build solaris-sparcv9 in tier1 which does not 
>>>>>> support precompiled headers at all, so to not be caught in 
>>>>>> jdk-submit you would have to be in Linux specific code. The 
>>>>>> example bug does not seem to be that. Mach5/jdk-submit was down 
>>>>>> over the weekend and yesterday so my suspicion is the offending 
>>>>>> code in this case was never tested.
>>>>>> That said, given that we get practically no benefit from PCH on 
>>>>>> Linux/GCC, we should probably just turn it off by default for 
>>>>>> Linux and/or GCC. I think we need to investigate Macos as well here.
>>>>>> /Erik
>>>>>>> -Aleksey

More information about the build-dev mailing list