windows build slow due to windows.h includes

Поиск
Список
Период
Сортировка
От Andres Freund
Тема windows build slow due to windows.h includes
Дата
Msg-id 20210921193035.pqzay43vpyv7in43@alap3.anarazel.de
обсуждение исходный текст
Ответы Re: windows build slow due to windows.h includes  (Andrew Dunstan <andrew@dunslane.net>)
Re: windows build slow due to windows.h includes  (Ranier Vilela <ranier.vf@gmail.com>)
Re: windows build slow due to windows.h includes  (Noah Misch <noah@leadboat.com>)
Список pgsql-hackers
Hi,

For the AIO stuff I needed to build postgres for windows. And I was a bit
horrified by the long compile times. At first I was ready to blame the MS
compiler for being slow, until I noticed that using mingw gcc from linux to
cross compile to windows is also a *lot* slower than building for linux.

I found some blog-post-documented-only compiler flags [1], most importantly
/d1reportTime. Which shows that the include processing of postgres.h takes
0.6s [2]

Basically all the time in a debug windows build is spent parsing windows.h and
related headers. Argh.

The amount of stuff we include in win32_port.h and declare is pretty absurd
imo. There's really no need to expose the whole backend to all of it. Most of
it should just be needed in a few port/ files and a few select users.

But that's too much work for my taste. As it turns out there's a partial
solution to windows.h being just so damn big, the delightfully named
WIN32_LEAN_AND_MEAN.

This reduces the non-incremental buildtime in my 8 core windows VM from 187s to
140s. Cross compiling from linux it's
master:
real    0m53.807s
user    22m16.930s
sys    2m50.264s
WIN32_LEAN_AND_MEAN
real    0m32.956s
user    12m17.773s
sys    1m52.313s

Still far from !windows compile times, but still not a bad improvement.

Most of the compile time after this is still spent doing parsing /
preprocessing. I sidetracked myself into looking at precompiled headers, but
it's not trivial to do that right unfortunately.


I think it'd be good if win32_port.h were slimmed down, and more of its
contents were moved into fake "port/win32/$name-of-unix-header" style headers
or such.


Greetings,

Andres Freund

[1] https://aras-p.info/blog/2019/01/21/Another-cool-MSVC-flag-d1reportTime/

[2]

postgres.c
Include Headers:
        Count: 483
                c:\Users\anfreund\src\postgres\src\include\postgres.h: 0.561795s
                        c:\Users\anfreund\src\postgres\src\include\c.h: 0.556991s
                                c:\Users\anfreund\src\postgres\src\include\postgres_ext.h: 0.000488s
                                        c:\Users\anfreund\src\postgres\src\include\pg_config_ext.h: 0.000151s
                                c:\Users\anfreund\src\postgres\src\include\pg_config.h: 0.000551s
                                c:\Users\anfreund\src\postgres\src\include\pg_config_manual.h: 0.000286s
                                c:\Users\anfreund\src\postgres\src\include\pg_config_os.h: 0.014283s
                                        C:\Program Files (x86)\Microsoft Visual
Studio\2019\Enterprise\VC\Tools\MSVC\14.29.30133\include\crtdefs.h:0.009727s
 
...
                                        c:\Users\anfreund\src\postgres\src\include\port\win32_port.h: 0.487469s
                                                C:\Program Files (x86)\Windows
Kits\10\include\10.0.20348.0\um\winsock2.h:0.449373s
 
...
                                                        C:\Program Files (x86)\Windows
Kits\10\include\10.0.20348.0\um\windows.h:0.439666s
 


Вложения

В списке pgsql-hackers по дате отправления:

Предыдущее
От: Ranier Vilela
Дата:
Сообщение: Eval expression R/O once time (src/backend/executor/execExpr.c)
Следующее
От: Andrew Dunstan
Дата:
Сообщение: Re: Delegating superuser tasks to new security roles (Was: Granting control of SUSET gucs to non-superusers)