Programm schnell kompilieren
-
Bist du sicher, dass die schnellere Version überhaupt mit dem gcc kompiliert wurde? Es könnte beispielsweise auch der Intel-Compiler benutzt worden sein, der dafür bekannt ist, in manchen Situation besonders gut zu optimieren (besonders für Intel-CPUs).
-
Geschwindigkeitsunserschiede können durch viele viele Dinge im Compiler entstehen, sowie in der Standard-Library etc.
Dass das "original compilierte" Programm schneller läuft, kann u.U. einfach daran liegen, dass ein anderer Compiler bzw. eine andere Version des GCC verwendet wurde. Oder eben auch andere Einstellungen. Guck dir mal die diversen Optimizer-Flags des GCC durch. -O2 bzw. -O3 sollte man auf jeden Fall verwenden, aber da enden meine GCC Kenntnisse auch schon
Wäre z.B. auch interessant, was der MSVC draus macht (falls der das Programm überhaupt "verdaut"), oder auch der von Nanyuki schon erwähnte Intel C++ Compiler.
-
Naja, die Windows Exe läuft nur wenn die Cygwin.dll im Verzeichnis ist. Aber der Intel Compiler ist eine gute Idee. Wie ich sehe gibt es für Windows nur eine 30 Tage Trailware. Hmmm
-
Den Microsoft Compilern habe ich den c-Source auch vorgesetzt: Wie es scheint können die von Version Vc++6 bis Express2008 kein C99. Ständig fehlen irgend welche Header. Bei anderen Compilern wie dem LCC, PellesC, Watcom, TCC, ... gibt es wieder andere Meldungen bzw es kompiliert, aber der Source crashed. Momentan bekomme ich den Source nur auf dem GCC zum Laufen.
-
Es gibt sehr sehr viele Flags für den GCC, ein Paar bekanntere wären -fomit-frame-pointer (ein zusätzliches Register verfügbar, macht aber Debugging schwerer) or -funroll-loops (sollte klar sein was das tut).
Mehr findest du im Handbuch zu GCC, aber diese beiden würde ich zuerst einmal testen, zumindest -fomit-frame-pointer ist bei -O2 nicht mit drin.
-
Albatross schrieb:
Den Microsoft Compilern habe ich den c-Source auch vorgesetzt: Wie es scheint können die von Version Vc++6 bis Express2008 kein C99. Ständig fehlen irgend welche Header. Bei anderen Compilern wie dem LCC, PellesC, Watcom, TCC, ... gibt es wieder andere Meldungen bzw es kompiliert, aber der Source crashed. Momentan bekomme ich den Source nur auf dem GCC zum Laufen.
Die können AFAIK schon C99, aber eben nur der C-Compiler, nicht der C++ Compiler.
Um welche Headers geht's denn?
-
hustbaer schrieb:
Die können AFAIK schon C99...
die ms-compiler jedenfalls nicht. der code des OP ist wohl ziemlich gcc-abhängig.
-
;fricky schrieb:
hustbaer schrieb:
Die können AFAIK schon C99...
die ms-compiler jedenfalls nicht. der code des OP ist wohl ziemlich gcc-abhängig.
Dann ist der Intel-Compiler doch perfekt, der kann die GCC spezifischen Sachen nämlich ziemlich gut.
-
;fricky schrieb:
hustbaer schrieb:
Die können AFAIK schon C99...
die ms-compiler jedenfalls nicht. der code des OP ist wohl ziemlich gcc-abhängig.
OK, hab grad nachgesenen, der MSVC kann wirklich nur "parts of" C99
-
hustbaer schrieb:
der MSVC kann wirklich nur "parts of" C99
naja, den zeilenkommentar '//', aber sonst hat er weder stdbool noch VLAs, kein 'restrict, usw. m$ will von C99 auch nix wissen.
-
Wie groß ist das Program? Ist es nur eine Code-Datei? Benutzt du 32-bit oder 64-bit? Was sagt (unter Linux)
file die ganzen linux-programm-dateien
?
-
Das Projekt besteht aus zehn Modulen. Da könnte ich notfalls per Hand die C99 Header entfernen und die Funktionen ersetzen. Das Programm ist vermutlich noch x32.
Hat schonmal wer von Euch den Intel Compiler unter Codeblocks benutzt? Nach dieser Anleitung habe ich die Pfade eingetragen. Kompiliere ich ein HelloWorld Programm erhalte ich diese Meldung:
Execution of 'icl.exe /nologo -Wall /X /IT:\Programme\IntelCompiler\Intel\Compiler\11.0\061\cpp\include /I"T:\Programme\Microsoft Visual Studio 9.0\VC\include" /I"T:\Programme\Microsoft SDKs\Windows\v7.0A\Include" /c main.c /Foobj\Release\main.obj' in 'T:\Cuv\benchmark' failed.
Nothing to be done.Gleiches passiert wenn ich diese iclvars_ia32.bat als PreBuildStep eintrage. (Mit dieser kann ich das HelloWorld per Dosshell kompilieren)
-
Ich werde im CodeBlocks Compiler Forum nachfragen...
Vielen Dank
-
Ist Visual Studio 2010 nicht C99 kompatibel? Die Header liegen zumindest im Include Verzeichnis.
-
----------- schrieb:
Ist Visual Studio 2010 nicht C99 kompatibel? Die Header liegen zumindest im Include Verzeichnis.
oh, hat sich ms beim 2010 dazu erbarmt C99 zu unterstützen? wäre nicht schlecht, aber es sind ja nicht nur headers, sondern der compiler muss es auch können (VLAs, restrict, etc.).
-
Also zumindest bei der Beta fehlt stdbool.h, nach dem Rest hab ich gar nicht mehr gesucht.
-
Komisch: Schreibe ich im VS2010 bool wird es blau markiert als sei es ein eingebauter Typ wie int. Kompiliere ich jedoch erkennt er bool nicht. stdbool.h fehlt tatsächlich. stdint.h ist jedoch da.
Da das VS2010 sowieso ständig abkackt arbeite ich eh nicht damit. Hoffen wir mal das MS den Rest dann auch mit rausbringt. bzw der Inhalt von stdbool ist ja lächerlich. Kann ich auch so hinzufügen...
-
----------- schrieb:
Komisch: Schreibe ich im VS2010 bool wird es blau markiert als sei es ein eingebauter Typ wie int. Kompiliere ich jedoch erkennt er bool nicht. stdbool.h fehlt tatsächlich. stdint.h ist jedoch da.
Die Hervorhebungen sind in VS leider sprachübergreifend. Das
bool
wird hervorgehoben, weil es in C++ und C# existiert. Mich stört es zum Beispiel dass in C++event
,array
undvalue
hervorgehoben werden, weil diese in C# als Schlüsselwörter existieren. Das ist ein extremer Minuspunkt bei der Syntaxhervorhebung von Visual Studio.Grüssli
-
----------- schrieb:
Komisch: Schreibe ich im VS2010 bool wird es blau markiert als sei es ein eingebauter Typ wie int. Kompiliere ich jedoch erkennt er bool nicht. stdbool.h fehlt tatsächlich. stdint.h ist jedoch da.
Da das VS2010 sowieso ständig abkackt arbeite ich eh nicht damit. Hoffen wir mal das MS den Rest dann auch mit rausbringt. bzw der Inhalt von stdbool ist ja lächerlich. Kann ich auch so hinzufügen...
Die Header wären das geringste Problem, es fehlt ja schon unterstützung für alle möglichen Sprachfeatures.
* restrict (könnte man per #define auf __restrict nachbauen)
* Variablen Deklaration nicht nur am Anfang der Funktion (der C++ Compiler kann das, meiner Meinung nach eine der nervigsten Einschränkungen von C(<99))
* VLAs
* Alles was C99 sonst noch so neues hat
-
Mich stört es zum Beispiel dass in C++ event, array und value hervorgehoben werden, weil diese in C# als Schlüsselwörter existieren.
value kommt von C++/CLI, event gibts da bestimmt auch, kp was array angeht, wenns das Schlüsselwort aber in C# gibt hab ich C# stärker verlernt als ich dachte, bist du sicher, dass der auch C# abdeckt und nicht nur C, C++ und C++/CLI?