Some ccache benchmarking

Erik Joelsson erik.joelsson at oracle.com
Fri Apr 19 10:10:51 UTC 2013


Hello,

In the new build, on Linux, configure tries to pick up and use ccache if 
available on the machine. It is even being picky about the version 
(3.1.4 minimum) to make sure that precompiled headers are supported, 
since those are used in the hotspot build. I have looked into this 
precompiled header support in ccache some and have some insights to 
share. The trigger for this was observing that building hotspot with an 
empty ccache took a very long time compared to not using ccache at all.

Looking at the ccache manual, for precompiled headers to actually be 
used, the gcc flag -fpch-preprocess needs to be added to the command 
line. What it does is enabling precompiled headers when running gcc in 
preprocess only mode, which ccache needs to do in order to create the 
hash for the cache. I have experimented with adding this flag to see 
what performance differences it would yield. As a second option, I've 
also tried disabling precompiled headers completely. Here is a summary 
of the results from running on my machine (Ubuntu 10.10 x86_64 8 cores):

Summary                    no ccache   empty cache   full cache
without -fpch-preprocess   2:42        5:28          1:07
with -fpch-preprocess      2:43        3:27          1:32
no precompiled headers     3:32        3:47          0:54

Adding the flag reduces the compilation time with an empty cache 
tremendously. However, it also increases the compilation time with a 
full cache significantly. Disabling precompiled headers completely when 
using ccache also reduces time with the empty cache, though not as much. 
It does however speed up compilation with a full cache even more than 
any of the other options.

My conclusion is that the current situation is bad and needs to be 
improved. Either of the methods tested will be an improvement. Here are 
the options as I see them:

A. Add -fpch-preprocess to CFLAGS permanently in hotspot.

B. Have configure add -fpch-preprocess if ccache is used.

C. Have configure disable precompiled headers if ccache is used. This 
also removes the current version requirement of 3.1.4 on ccache for 
precompiled header support which is enforced in configure, and would 
automatically (re)enable ccache use in jprt.

I would lean towards option C, but would be interested in other opinions.

/Erik



More information about the build-dev mailing list