Stop using precompiled headers for Linux?

Ioi Lam ioi.lam at
Thu Nov 1 23:53:32 UTC 2018

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?

- 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