2012-04-05 17 views
9

Ho un codice C++ che ha 3 dichiarazioni di array.Il tempo di compilazione g ++ dipende dalla dimensione dell'array?

float A[NUM]; float B[NUM]; float C[NUM];

Quando compilo con NUM=512, la compilazione è veloce

time g++ -DNUM=512 trials trials.cpp -lm

0.16s user 0.04s system 94% cpu 0.219 total

Tuttavia, quando compilo con NUM=167772160, ci vuole più tempo.

time g++ -DNUM=167772160 trials trials.cpp -lm

7.90s user 0.69s system 99% cpu 8.604 total

Non ho usato C++ in anni. Sono curioso di sapere perché c'è una differenza di tempo nella compilazione anche se i file oggetto dopo la compilazione sono della stessa dimensione.

+1

Questi dati sono statici? –

+0

Sono dichiarazioni globali. – mutelogan

+1

Chissà quali ottimizzazioni g ++ prova a fare. Forse assegna una tale matrice per verificare l'esistenza di un accesso di memoria non valido. Prova a eseguire nuovamente il benchmark (forse fallo più volte) con -O0 e compila separatamente la compilation e il link. – j13r

risposta

10

Questo è piuttosto un enigma ben noto. Da qualche parte lungo la strada, la memoria effettiva per l'array sta per essere assegnato

See: Linker performance related to swap space?

Sembrerebbe che, come abbiamo potuto sospettato, sembra ld sta in realtà cercando di anonimo mmap l'intero spazio di memoria statica di questo array (o forse l'intero programma, è difficile da dire dato che il resto del programma è così piccolo, potrebbe rientrare in quel 4096 in più).

legato anche:

+0

E 'la performance del linker dopo tutto !! Molte grazie. – mutelogan

0

È il vostro matrice dichiarata livello locale o globale? Se è globale, poiché il linker dovrebbe allocare memoria nella sezione .data, questo potrebbe richiedere molto tempo. Tuttavia, se lo si dichiara in locale, poiché la memoria viene allocata in fase di esecuzione, non in tempo di collegamento. Sarà il problema del linker, ma un problema causato dall'analizzatore o dall'ottimizzatore del compilatore.

Problemi correlati