Forum: PC-Programmierung VC++ großes Array -> lange compilieren


von deep d. (deepdiver99)


Lesenswert?

Hallo!

Habe unter Visual C++ in einer Funktion ein lokales Array("const 
unsigned int Encoder_Soll[] = {0,544998,770746,943969,1090004,...." ca. 
254648 Byte groß).
Nachdem ich dieses Array angelegt habe dauert das compilieren etliche 
Minuten. Vorher waren es nur Sekunden.

Hat jemand ne Idee wie man das compilieren beschleunigen könnte?

Viele Grüße

PS: mein Rechner ist schnell genug :-)

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

"Das Compilieren" dauert lange - das des gesamten Projektes oder auch 
das Übersetzen nur des einzelnen Moduls?

(Letzteres kannst Du mit Ctrl+F7 erreichen)

von Udo S. (urschmitt)


Lesenswert?

Mach ein make file, lager den lange dauernden Teil in ein eigenes C File 
aus. Dann wird nur noch 1 mal lange compiliert solange du an diesem Teil 
nichts änderst.

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Udo Schmitt schrieb:
> Dann wird nur noch 1 mal lange compiliert solange du an diesem Teil
> nichts änderst.

Dafür braucht es kein makefile, das bekommt die Projektverwaltung von 
Visual Studio tatsächlich auch selber hin.

von Udo S. (urschmitt)


Lesenswert?

Rufus Τ. Firefly schrieb:
> Dafür braucht es kein makefile, das bekommt die Projektverwaltung von
> Visual Studio tatsächlich auch selber hin.

Nicht wenn man dann immer "Rebuild all" (oder wie das in VisualStudio 
heisst) aufruft :-)

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Udo Schmitt schrieb:
> Nicht wenn man dann immer "Rebuild all" (oder wie das in VisualStudio
> heisst) aufruft :-)

Das macht das gleiche wie

  make clean
  make all

Hmm? Was war jetzt noch mal der Unterschied?

von Yalu X. (yalu) (Moderator)


Lesenswert?

Nimm  einfach einen anderen Compiler. GCC braucht auf meiner alten Gurke
(T7500 mit 2,20GHz) gerade mal 0,167s.

von Peter II (Gast)


Lesenswert?

> Habe unter Visual C++ in einer Funktion ein lokales Array("const
> unsigned int Encoder_Soll[] = {0,544998,770746,943969,1090004,...." ca.
> 254648 Byte groß).

macht es global, so Datenmengen sollte man nicht auf den Stack legen. 
Global compiliert schneller.

von Deepdiver99 (Gast)


Lesenswert?

Danke für eure Ideen. Werde sie mal testen.

VG

von foo (Gast)


Lesenswert?

Yalu X. schrieb:
> Nimm  einfach einen anderen Compiler. GCC braucht auf meiner alten Gurke
> (T7500 mit 2,20GHz) gerade mal 0,167s.

Global oder lokal?
Global dauert beim VS auch nur eine Sekunde.

von Klaus W. (mfgkw)


Lesenswert?

Wenn sich die Werte ncht ändern, sollte es sowieso const sein, dann 
stört auch ein static nicht und es liegt nicht mehr auf dem Stack.

Global ist eine technische Lösung, aber wenn das Feld nur lokal 
verwendet werden soll, ist global der erste Schritt zu einem schlechten 
Programm.
Mit static const vermeidet man die globale Variable.

von Peter II (Gast)


Lesenswert?

Wobei man bei so vielen Werte schon darüber nachdenken kann, sie 
überhaupt nicht in der EXE zu haben.
Die könnte man als extra Datendatei mitliefern.

von Yalu X. (yalu) (Moderator)


Lesenswert?

foo schrieb:
> Global oder lokal?
> Global dauert beim VS auch nur eine Sekunde.

Stimmt, ich habe übersehen, dass das Array lokal sein soll. Wenn ich es
zusammen mit etwas Code, der darauf zugreift, in eine Funktion packe,
braucht der Compiler 0,217s, also deutlich länger ;-)

Wenn ich noch ein "static" davor schreibe, was sich bei großen Variablen
wie dieser sowieso anbietet, werden 0,189s benötigt.

von Deepdiver99 (Gast)


Lesenswert?

Global fällt aus. Arbeite unter VC++ CLI und mit Threads. Hatte CLI mal 
nicht erwähnt um mir die Kommentare zu ersparen. Das mischen vom Managed 
und unManaged Code gefällt dem Compiler nicht.
Mit dem Auslagern in eine extra Datei versuche ich später mal. Beim 
STM32 hat das aber nichts gebracht. Dort ist sie aber zum Glück global.

von Peter II (Gast)


Lesenswert?

Deepdiver99 schrieb:
> Global fällt aus. Arbeite unter VC++ CLI und mit Threads.

und? das ding ist const. damit kann man auch mit 100Threads gleichzeitig 
zugreifen.

von foo (Gast)


Lesenswert?

Hast Du das probiert? Mit static? Wenn du unbeding Functions-lokal haben 
willst.
1
void foo(void)
2
{
3
   static const unsigned int big_array[] = {1,2,3,4, ...};
4
}

sonst halt Filescope:
1
static const unsigned int big_array[] = {1,2,3,4, ...};

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Deepdiver99 schrieb:
> Arbeite unter VC++ CLI

Ah. Das ist gar kein C++, sondern eine .Net-Sprache.

von Peter II (Gast)


Lesenswert?

Rufus Τ. Firefly schrieb:
> Deepdiver99 schrieb:
>> Arbeite unter VC++ CLI
>
> Ah. Das ist gar kein C++, sondern eine .Net-Sprache.

außer wenn CLI für Command Line Interface steht.

von Mark B. (markbrandis)


Lesenswert?

Deepdiver99 schrieb:
> Arbeite unter VC++ CLI und mit Threads.

Du meinst also MS VS C++/CLI? (um mal die Abkürzungen komplett zu 
machen)

: Bearbeitet durch User
von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Peter II schrieb:
> außer wenn CLI für Command Line Interface steht.

Tut es nicht.

von deep d. (deepdiver99)


Lesenswert?

Ja, meine MS VS C++/CLI.

Mit dem Auslagern in eine separate Klasse hat es geklappt.
Danke für die Hilfe :-)

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.