Cu constructor cum să accelereze compilarea folosind antete precompilate

C ++ Builder: Cum să accelerați compilarea folosind antete precompilate

C ++ Builder: Cum să accelerați compilarea folosind antete precompilate


Antetele precompilate pot crește dramatic
viteze de compilare.
C ++ Builder Ghid de limbă


În loc de introducere, dați imediat un exemplu. O construcție completă a unui proiect care conține aproximativ 170 de module cpp, când se utilizează antete precompilate, are loc în 811 secunde, în timp ce numărul de linii compilate este de 1.808.780. Când compilați același proiect fără a utiliza antete precompilate, timpul de construire este de 2399 de secunde, iar numărul de linii procesate de compilator este de 45,261,820. Impresionantă, nu-i așa? Plata pentru această accelerare, în principiu, nu este mare - o imagine precompilată, a cărei dimensiune este de aproximativ 40 MB.

La compilarea codului sursă, compilatorul trebuie să proceseze toate fișierele de proiectare * .cpp și toate fișierele * .h incluse în ele. În acest caz, sunt procesate atât fișiere antet personalizate, cât și cele standard, cum ar fi vcl.h sau Word2k.h. Numărul de cod găsit în anteturile standard poate fi foarte mare, de exemplu, dimensiunea fișierului Word2k.h depășește 5 MB, există mai mult de 130.000 de linii de cod în el.

Deoarece conținutul anteturilor standard nu se schimbă, compilarea acestora cu fiecare construcție a proiectului este o pierdere de timp. Anteturile precompilate ajută la rezolvarea acestei probleme - fișierele standard sunt compilate o singură dată și apoi este utilizată o imagine binară compilată.

Principiul funcționării anteturilor precompilate
Pentru a controla directivele precompilate, se folosește directiva compilatorului #pragma hdrstop. Toate fișierele de antet incluse înaintea acestei directive sunt plasate într-o singură imagine, de exemplu:

Această secvență creează o imagine care conține vcl.h și șirul compilat. Această imagine va fi utilizată pentru un alt fișier cpp dacă aceleași fișiere sunt incluse în directiva hdrstop în aceeași ordine. Voi observa că nu numai compoziția, dar și ordinea anteturilor sunt importante - chiar dacă următorul fișier cpp include aceleași anteturi, dar mai întâi șir specificat și apoi vcl.h, atunci va fi creată o nouă imagine pentru acest fișier cpp.

Astfel, pentru a reutiliza antetul precompilat, trebuie îndeplinite două condiții:

    - Componența fișierelor incluse în fața directivei hdrstop trebuie să fie aceeași
    - Secvența de includere a fișierelor înaintea directivei hdrstop trebuie să fie aceeași

Reducerea costului de compilare a anteturilor standard la minim este posibilă numai dacă compilați o imagine care conține toate anteturile standard necesare pentru proiect. Acest lucru necesită:
    - Toate fișierele cpp ale proiectului au avut același bloc de incluziuni înainte de directiva hdrstop
    - Acest bloc ar trebui să includă TOATE fișierele header standard necesare pentru proiect

Este foarte simplu să executați aceste condiții, pentru aceasta, la începutul fiecărui fișier cpp trebuie să introduceți următoarele rânduri:

unde pch.h este fișierul care conține toate anteturile standard:

Textul integral al versiunii mele de acest fișier este dat la sfârșitul articolului. Fișierele h incluse în imaginea precompilată sunt constrânse - nu ar trebui să fie date inițializate în ele, de exemplu, în math.hpp există linii:

Din cauza acestor constante, nu puteți include math.hpp în fișierul pch.h.
Apropo, C ++ Builder implementează strategia de control descrisă a anteturilor precompilate atunci când adaugă noi module la proiect. De exemplu, atunci când creați o nouă aplicație, Unit1.cpp va fi după cum urmează:

Dacă te uiți la textul vcl.h, poți vedea că acesta este shell-ul pentru includerea unui număr mare de alte fișiere standard de antet.

Puteți controla compoziția anteturilor incluse în vcl.h cu caractere speciale (INC_VCLDB_HEADERS, INC_VCLEXT_HEADERS, etc.). În versiunea mea de pch.h, aceste caractere sunt definite folosind #define înainte ca vcl.h să fie activată, ceea ce duce la o creștere a numărului de fișiere incluse.

Ca și în proiectul existent, procedați la utilizarea anteturilor precompilate

Chiar și într-un proiect mare, este ușor să vă deplasați la utilizarea antetelor precompilate.

Primul pas este crearea fișierului antet pch.h. Acesta ar trebui să fie plasat în dosarul proiect, conținutul acestui fișier sunt enumerate la sfârșitul articolului.

Apoi, în proprietățile de proiect pentru a permite caching antetele precompilate, acesta este, de asemenea, încurajat să indice fișierul „personal“, în care pentru a stoca imaginea antetele precompilate: Project - Options - Compiler fila, grupul „antetele pre-compilate“. Aici ar trebui să selectați "Anteturi precompilate cache", iar în câmpul "Nume fișier" introduceți "pch.csm". Cu această setare, imaginea antecedentelor precompilabile se va afla în dosarul proiectului din fișierul pch.csm.

După aceea, la începutul fiecărui modul cpp, trebuie să introduceți 2 linii:

Toate fișierele antetului anterior incluse rămân în locurile lor, nu este necesar să le ștergeți. De exemplu:

Întrucât, în toate rubricile standard, se folosesc tutorii de reînscriere, re-menționarea lor nu implică reîncadrarea.

În principiu, atunci când se utilizează pch.h, necesitatea tehnică de a include anteturile standard dispare. Cu toate acestea, este util să specificați toate anteturile necesare pentru fiecare modul particular de mai jos directiva #pragma hdrstop. În primul rând, documentează într-o oarecare măsură modulul - pe fișierele incluse puteți evalua ce funcții utilizează acest modul. În al doilea rând, facilitează reutilizarea modulului în alte proiecte, în care nu se utilizează fie pch.h, fie conținutul său poate fi diferit.

Teoretic, puteți îmbunătăți în continuare eficiența compilării prin includerea în pch.h nu numai standard, ci și toate fișierele antet personalizate. În practică, deoarece anteturile utilizatorilor se schimbă destul de frecvent, aceasta poate duce la recompilarea frecventă a pch.h, ceea ce va afecta negativ timpul de compilare. În plus, anteturile personalizate nu sunt de obicei foarte mari și sunt compilate foarte rapid. Prin urmare, includerea lor pch.h nu este recomandată.

Cum se verifică dacă anteturile precompilate sunt utilizate în mod eficient

Când adăugați fișiere noi în proiect, nu uitați să includeți pch.h în acestea, altfel imaginea precompilată obișnuită nu va fi folosită pentru ele. Aceeași situație poate apărea dacă anteturile standard sunt incluse în unele module care nu sunt incluse în pch.h. Pentru a urmări astfel de fișiere, există mai multe moduri:

    - vizualizarea procesului de compilare. De obicei, numărul de linii compilate într-un fișier nu trebuie să depășească 10.000-15.000 de rânduri
    - dacă este selectat un fișier individual pentru ca proiectul să stocheze imaginea antecedentelor precompilate și acest fișier se numește pch.csm, atunci ar trebui să acordați atenție prezenței fișierelor auxiliare cu numele pch. # 00, pch. # 01, etc. Dacă aceeași imagine precompilată este folosită pentru toate fișierele de proiect, atunci fișierul auxiliar trebuie să fie doar unul - pch. Dacă există mai multe astfel de fișiere, înseamnă că sunt create imagini suplimentare pentru unele module cpp.
    - În proprietățile proiectului, selectați opțiunea Afișați mesaje generale (Proiect -> Opțiuni -> fila Compilator). Apoi, fereastra Mesaje va afișa informații suplimentare în timpul procesului de compilare, inclusiv informații despre încărcarea antetelor precompilate. Dacă fișierul a descărcat imaginea precompilată, fereastra de mesaje atunci când numele său va apărea „[C ++] Încărcat antete precompilate“.


Despre cele de mai sus
Dacă există întrebări și observații cu privire la materialul de mai sus, atunci sunt gata să le acceptăm - scrie [email protected].


P.S.
Am de mai multe ori pentru a raporta probleme cu antete precompilate - că Generatorul începe să dea avertisment „Dialogs.hpp (437): W8058 Nu se poate crea antet precompilata: date inițializate în antet“ și nu creează antet precompiled.
Din cauza a ceea ce apare, nu am înțeles, dar, așa cum mi-a scris Aleutdinov Serghei Harizovici, el a reușit să găsească o soluție:
citat:

Problema a fost rezolvată prin "manevra de bypass".

Creat fișier AllHeaders.hpp antet, care include toate VCL hodery non (DevExpress, FIBPlus, proprii antete rar modificate etc.)
În fiecare fișier de proiect au fost inserate trei linii:
#include
#include
#pragma hdrstop

Articole similare