Programm schnell kompilieren
-
Hallo Forum,
ich habe ein Programm das eine kryptographische Berechnung durchführen soll bekommen. Der mitgelieferte Source ist für Linux, genauso das bin File, es gibt aber auch eine Windows-Exe mit Cygwin DLL. Ich möchte das das Programm so schnell wie möglich abläuft. Deshalb war es meine Idee den Source speziell für meinen Rechner (Intel Dual Core2 x64) zu kompilieren.
1. Benutze ich die Cygwin Exe unter Windows schafft das Programm 28.000 Berechnungen pro Sek.
2. Unter Ubuntu mit der vorkompiliert Version nur 22.000 B/s.
3. Unter Ubuntu und selbst kompiliert mit GCC4.3 (-O3, -march=core2, mtune=core2) nur 22.000 B/s.
5. Ich kompiliere das Programm mit GCC4.4 unter Windows ohne jegliche Optimierung: 22.000 B/s
6. Ich kompiliere das Programm mit GCC4.4 unter Windows mit den Switchen wie Ubuntu : 23.000 B/sWie kann es sein das meine eigenen Builds so viel langsamer sind? (Vorausgesetzt natürlich ich habe den aktuellen Source, ich gehe aber eigentlich nicht davon aus beschissen worden zu sein.) Habe ich irgend einen wichtigen Kompiler Switch vergessen? (Im Makefile stehen keine besonderen Switches, bzw wenn ich diese bei Codeblocks einfüge ändert sich nichts an der Geschwindigkeit)
Für mich ist es das erste Mal SW zu benutzen die Möglichst schnell ablaufen soll. Ist es so das unter Windows die SW generell schneller abläuft oder liegt das an der etwas älteren GCC Version?
Vielen Dank
Albatross
-
Windows ist generell schneller als Linux in den meisten Fällen. Der Linux Kernel hat einen ganz anderen Scheduling Algorithmus, was in den meisten Fällen bedeutet, daß Prozesse bzw. Threads kürzere Laufzeiten haben, als unter Windows und deshalb mehr Zeit durch die häufigeren Kontextwechsel verloren geht.
-
@Windows Profess0r: Könntest du das mit einer Quelle belegen.
Wenn ich mir die Textdateien des Projekt so ansehe steht dort nichts von einem Windows Port, es wäre also denkbar das die Cygwin Version von jemand anders erstellt wurden ist (und dabei krass optimiert wurde), ohne den Source hinzugefügt zu haben...
-
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...