RFR: 8365053: Refresh hotspot precompiled.hpp with headers based on current frequency [v11]

Francesco Andreuzzi duke at openjdk.org
Mon Aug 25 09:26:12 UTC 2025


On Tue, 12 Aug 2025 11:32:42 GMT, Francesco Andreuzzi <duke at openjdk.org> wrote:

>> In this PR I propose to refresh the included headers in hotspot `precompiled.hpp`. The current set of precompiled headers was refreshed in 2018, 7 years ago. I repeated the same operations and measurements after refreshing the set of precompiled headers according to the current usage frequency.
>> 
>> These are the results I observed. Depending on the platform, the improvement is between 10 and 20% in terms of total work (user+sys). The results are in seconds.
>> 
>> 
>> linux-x64 GCC
>> master      real 81.39 user 3352.15 sys 287.49
>> JDK-8365053 real 81.94 user 3030.24 sys 295.82
>> 
>> linux-x64 Clang
>> master      real 43.44 user 2082.93 sys 130.70
>> JDK-8365053 real 38.44 user 1723.80 sys 117.68
>> 
>> linux-aarch64 GCC
>> master      real 1188.08 user 2015.22 sys 175.53
>> JDK-8365053 real 1019.85 user 1667.45 sys 171.86
>> 
>> linux-aarch64 clang
>> master      real 981.77 user 1645.05 sys 118.60
>> JDK-8365053 real 791.96 user 1262.92 sys 101.50
>
> Francesco Andreuzzi has updated the pull request incrementally with two additional commits since the last revision:
> 
>  - conditional includes
>  - variants

### Amazon Linux 2 x86_64 + Docker `debian:bookworm-slim`

| Git Ref  | Compiler | Build flavor | Average (user+sys)  | StdDev  |
|----------|--------|--------|----------|---------|
| master   | gcc    | server   | 2962.90  | 3.04    |
| master   | gcc    | fd     | 4165.31  | 4.36    |
| master   | gcc    | custom | 677.99   | 0.45    |
| master   | clang  | server   | 2247.31  | 4.27    |
| master   | clang  | fd     | 3054.74  | 0.23    |
| master   | clang  | custom | 496.13   | 1.30    |
| 9e0cb7e8 | gcc    | server   | 2552.51  | 1.44    |
| 9e0cb7e8 | gcc    | fd     | 3650.50  | 1.68    |
| 9e0cb7e8 | gcc    | custom | 630.25   | 1.80    |
| 9e0cb7e8 | clang  | server   | 1826.63  | 4.21    |
| 9e0cb7e8 | clang  | fd     | 2514.22  | 1.16    |
| 9e0cb7e8 | clang  | custom | 453.29   | 0.52    |
| 892ecb5a | gcc    | server   | 2570.87  | 0.96    |
| 892ecb5a | gcc    | fd     | 3644.73  | 7.16    |
| 892ecb5a | gcc    | custom | 626.08   | 2.83    |
| 892ecb5a | clang  | server   | 1824.21  | 2.31    |
| 892ecb5a | clang  | fd     | 2518.37  | 1.75    |
| 892ecb5a | clang  | custom | 453.56   | 0.74    |

### Amazon Linux 2 aarch64 + Docker `debian:bookworm-slim`

| Git Ref  | Compiler | Build flavor | Average (user+sys)  | StdDev  |
|---------|--------|--------|----------|---------|
| master  | gcc    | server   | 2248.63  | 4.49    |
| master  | gcc    | fd     | 3238.64  | 4.29    |
| master  | gcc    | custom | 523.34   | 6.50    |
| master  | clang  | server   | 1877.40  | 3.01    |
| master  | clang  | fd     | 2516.10  | 2.95    |
| master  | clang  | custom | 437.22   | 1.22    |
| 9e0cb7e8| gcc    | server   | 1811.81  | 5.17    |
| 9e0cb7e8| gcc    | fd     | 2693.76  | 7.68    |
| 9e0cb7e8| gcc    | custom | 440.88   | 1.81    |
| 9e0cb7e8| clang  | server   | 1406.12  | 6.20    |
| 9e0cb7e8| clang  | fd     | 1872.41  | 13.27   |
| 9e0cb7e8| clang  | custom | 354.82   | 0.65    |
| 892ecb5a| gcc    | server   | 1774.99  | 13.02   |
| 892ecb5a| gcc    | fd     | 2623.76  | 1.51    |
| 892ecb5a| gcc    | custom | 428.87   | 1.05    |
| 892ecb5a| clang  | server   | 1363.65  | 0.61    |
| 892ecb5a| clang  | fd     | 1842.38  | 6.90    |
| 892ecb5a| clang  | custom | 344.98   | 1.21    |

### Fedora 42 x86_64

| Git Ref  | Compiler | Build flavor | Average (user+sys)  | StdDev  |
|----------|--------|--------|----------|---------|
| master   | gcc    | server   | 2713.01  | 3.68    |
| master   | gcc    | fd     | 3849.04  | 18.43   |
| master   | gcc    | custom | 650.11   | 0.51    |
| master   | clang  | server   | 2227.25  | 0.95    |
| master   | clang  | fd     | 2998.13  | 0.37    |
| master   | clang  | custom | 499.48   | 0.15    |
| 9e0cb7e8 | gcc    | server   | 2398.33  | 1.41    |
| 9e0cb7e8 | gcc    | fd     | 3449.44  | 1.61    |
| 9e0cb7e8 | gcc    | custom | 609.89   | 0.70    |
| 9e0cb7e8 | clang  | server   | 1781.34  | 1.05    |
| 9e0cb7e8 | clang  | fd     | 2431.96  | 0.37    |
| 9e0cb7e8 | clang  | custom | 451.13   | 0.22    |
| 892ecb5a | gcc    | server   | 2407.65  | 2.21    |
| 892ecb5a | gcc    | fd     | 3457.53  | 0.34    |
| 892ecb5a | gcc    | custom | 611.44   | 0.51    |
| 892ecb5a | clang  | server   | 1784.70  | 0.69    |
| 892ecb5a | clang  | fd     | 2437.44  | 0.82    |
| 892ecb5a | clang  | custom | 452.42   | 0.20    |

### Git Ref
- 9e0cb7e8: First approach in this PR, counting header inclusions
- 892ecb5a: `-ftime-trace` + ClangBuildAnalyzer (last commit)

### Compiler

- Clang 20
- GCC 12

### Build flavor

- `fd`: `--enable-debug`
- `custom`: `--with-jvm-variants=custom --enable-jvm-feature-epsilongc`

Each of the measurements above was taken three times.

I got some measurements using a cutoff of **100.000ms** in ClangBuildAnalyzer, so all headers taking more than that are included in `precompiled.hpp`. Overall, 892ecb5a95695d75cef80dfdf053e50a092b0784 (last commit) seems to perform better than both `master` and the initial approach I tried in this PR.

It would be nice if other compilers would provide similar metrics as `-ftime-trace`, but I couldn't find anything useful. So far GCC seems to like the new precompiled set.

-------------

PR Comment: https://git.openjdk.org/jdk/pull/26681#issuecomment-3219345092
PR Comment: https://git.openjdk.org/jdk/pull/26681#issuecomment-3219373245


More information about the hotspot-dev mailing list