2012-04-05 11 views
9

Ich habe einen C++ Code, der 3 Array-Deklarationen hat.Hängt die g ++ - Kompilierzeit von der Array-Größe ab?

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

Wenn ich mit NUM=512 kompilieren, Kompilation ist schnell

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

0.16s user 0.04s system 94% cpu 0.219 total

Allerdings, wenn ich mit NUM=167772160 kompilieren, es mehr Zeit in Anspruch nimmt.

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

7.90s user 0.69s system 99% cpu 8.604 total

Ich habe C nicht verwendet ++ in Jahren. Ich bin gespannt, warum es bei der Kompilierung einen Zeitunterschied gibt, obwohl die Objektdateien nach der Kompilierung gleich groß sind.

+1

Sind diese Arrays statische Daten? –

+0

Sie sind globale Deklarationen. – mutelogan

+1

Wer weiß, welche Optimierungen g ++ versucht zu machen. Vielleicht weist es ein solches Array zu, um zu prüfen, ob es einen ungültigen Speicherzugriff gibt. Versuchen Sie, den Benchmark erneut auszuführen (vielleicht mehrere Male) mit -O0 und führen Sie die Kompilierung und Verknüpfung getrennt durch. – j13r

Antwort

10

Dies ist ein ziemlich bekanntes Rätsel. Irgendwo auf dem Weg, wird der tatsächliche Speicher für das Array gehen

See zugewiesen werden: Linker performance related to swap space?

Es wäre das scheint, wie wir vermutet haben könnte, ist es wie ld sieht tatsächlich versucht, zu anonym Mmap den gesamten statischen Speicherplatz dieses Array (oder möglicherweise das gesamte Programm, ist es schwer zu sagen, da der Rest des Programms so klein ist, könnte es alle in diesem zusätzlichen 4096 passen).

Auch bezogen werden:

+0

Es ist die Linker-Performance nach allem !! Danke vielmals. – mutelogan

0

Ist Ihr Array lokal oder global deklariert? Wenn es global ist, da der Linker Speicher im .data-Abschnitt reservieren sollte, kann dies lange dauern. Wenn Sie es jedoch lokal deklarieren, weil der Speicher zur Laufzeit zugeordnet ist, wird keine Verbindungszeit angegeben. Es wird das Problem des Linkers sein, aber ein Problem, das durch den Analysator oder den Optimierer des Compilers verursacht wird.

Verwandte Themen