Unter Linux Win32-Anwendungen erstellen
-
Klasse! Funktioniert
Hab es mal schnell auf meinem großen Rechner ausgeführt, aber es ist SEHR VIEL langsamer als mein Kubuntu-Laptop! Obwohl der große deutlich mehr Leistung hat...
Vergleich mit einer Berechnung bis max. 2.000.000:
Kubuntu MIT Ausgabe benötigt 10 Sekunden
Windows MIT Ausgabe benötigt 333 Sekunden
Kubuntu OHNE Ausgabe benötigt 4 Sekunden
Windows OHNE Ausgabe benötigt 306 SekundenWoran liegt das? Liegt das wirklich am Linux Kernel?
Oder ist MinGW nicht so der effizienteste? Gibts G++ auch für Windows?
Der Code ist folgender:
#include <stdio.h> #include <math.h> #include <stdlib.h> #include <time.h> int main() { int zahl, grenze = 0, i = 0; time_t tsanfang, tsende; bool primzahl, stop = false; printf("Primzahlberechner von ************** v0.1\n\n"); printf("Bitte geben Sie eine Grenze ein, bis zu der die Primzahlen berechnet werden sollen.\n"); printf(" [x] Zahl\n"); printf(" [0] Programm beenden\n"); printf(" Eingabe: "); scanf("%d",&grenze); system("clear"); // "cls" für Windows printf("Primzahlberechner von ************** v0.1\n"); printf("=========================================\n"); printf("Die folgenden Primzahlen wurden für die Zahl %d berechnet:\n",grenze); tsanfang = time(NULL); while(i <= grenze && grenze != 0) { zahl = 2; primzahl = true; while(zahl <= sqrt(i)) { if(i % zahl == 0) { primzahl = false; } zahl++; } if(primzahl == true) { if(i != 0) { printf("%d\t",i); } } i++; } tsende = time(NULL); printf("\n\nDiese Rechnung wurde in %d Sekunden durchgeführt.", tsende - tsanfang); }
Das ist doch schon soweit sehr gut oder nicht?
EDIT: Habe mal "meine" bereits kompilierte Datei hochgeladen: http://www.dunkleorte.de/primzahlen.exe
Die Linux-Executable kann ich auch hochladen, bei Bedarf.
EDIT 2: Habe mal die Ausgabe der Primzahlen weggelassen. Jetzt geht es unter Windows etwas schneller, nämlich 306 Sekunden. Linux benötigt jetzt nurnoch 4 Sekunden!Ciao
-
Mit -O3 dauert das bei mir unter Windows ~45 Sekunden (gcc 4.3.2).
Mir fällt auf, dass nach primzahl=false ein break fehlt. Mit break dauert es dann auch unter Windows nur noch 4 Sekunden.
Evtl. erkennen neuere Versionen des gcc selbst, dass sie an der Stelle die Schleife direkt verlassen können. Die MinGW-Version in den Ubuntu-Repositories ist dagegen nicht gerade die neuste.Gibts G++ auch für Windows?
Jo, nennt sich MinGW (Minimalist GNU for Windows)
Hier gibt es immer aktuelle Builds:
http://www.tdragon.net/recentgcc/Außerdem: if(primzahl == true) lässt sich zu if(primzahl) kürzen. Erstere Version ist redundant und fehleranfälliger (z.B. kann man aus Versehen primzahl = true schreiben).
-
Ja, war eine Aufgabe aus der Schule.
Wie meinst du das mit break? Kenne das nur von PHP:
switch($variable) { case "wert": echo "Hallo Welt"; break; }
Oder wie? Und warum die Schleife direkt verlassen? Sorry, bin Anfänger
-
Organized schrieb:
Wie meinst du das mit break?
Per break kannst Du die while-Schleife direkt verlassen.
Und warum die Schleife direkt verlassen? Sorry, bin Anfänger
Naja, wenn Du schon weißt, dass eine Zahl keine Primzahl ist, weil sie mit Modulo 0 durch irgendwas teilbar ist, musst Du nicht weitertesten ob sie Modulo 0 durch irgendwas anderes teilbar ist, sondern kannst einfach die Schleife verlassen.
-
Dieser Thread wurde von Moderator/in nman aus dem Forum Linux/Unix in das Forum ANSI C verschoben.
Im Zweifelsfall bitte auch folgende Hinweise beachten:
C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?Dieses Posting wurde automatisch erzeugt.
-
Danke, jetzt gehts deutlich Fixer
Weißt du, wo ich die neue MinGW-Version als .deb oder so finde? Habs nicht so drauf, mit Programme installieren unter Linux
Aber ist schonmal super, dass es jetzt so gut geht. Aber nichts destotrotz ist Linux etwas schneller
Bis 2 Mio mit Ausgabe: Linux 10 Sek., Win7 49 Sek.
Ist aber auch ein gehöriger Unterschied zum vorherigen Ergebnis! Danke!!
EDIT: Linux benötigt mit dem break; jetzt nurnoch 2 Sekunden für 2.000.000
Kann es nicht wirklich sein, dass der Kernel dafür einfach schneller ist?
-
Organized schrieb:
EDIT: Linux benötigt mit dem break; jetzt nurnoch 2 Sekunden für 2.000.000
Kann es nicht wirklich sein, dass der Kernel dafür einfach schneller ist?
Nö, der Kernel kommt lediglich bei der Ausgabe ins Spiel.
Und die Konsolenausgabe unter Windows ist vergleichsweise in der Tat nicht gerade flott.Mögliche Gründe:
1. Die CPU in deinem Laptop ist eben doch etwas schneller. Beachte auch, dass dir hier zusätzliche CPU-Kerne nichts nützen.
2. Die native gcc-Version auf dem Laptop (wahrscheinlich 4.4.x), kann besser optimieren als die 4.2.x-Version, die bei dem MinGW aus den Repositories dabei sein müsste.
3. Auf deinem Windowsrechner laufen hunderte Rechenzeit verschwendende Tasks im Hintergrund.
-
Mhh, dann kann es wirklich an der Ausgabe unter Windows liegen... Werde dazu nochmal einige Tests durchführen!
Danke dir für deine Hilfe
-
Habe dann doch noch eine Frage.
Undzwar habe ich es jetzt so programmiert, dass man gefragt wird, ob man die Primzahlen sehen will oder nicht. Bei "nein" soll dann nur stehen "Bitte warten Sie...", den Befehl dafür habe ich vor die Berechnungs-Schleife gesetzt. Allerdings wird dieser erst angezeigt, wenn die Schleife fertig ist! Aber es steht doch davor?
Muss ich erst mit einem bestimmten Befehl den Cache ausgeben oder so?
-
Organized schrieb:
Muss ich erst mit einem bestimmten Befehl den Cache ausgeben oder so?
Kann sein.
In C geht das mit fflush(stdout), glaube ich.
-
Oder auch einfach printf("\n"); so weit ich weiss.
-
Danke, fflush(stdout); funzt. Aber da der Befehl fflush(stdin); mir schon bekannt ist, hätte ich selber drauf kommen können
-
sry, das ich den hier noch ü 15 Monate mal eine Frage reinstelle, aber wie schaut es aus, wenn ich eine Libraray für Ubuntu und Win Compalieren will?
kann ich in Monodevelop auch irgendwie den Namen der Ausgabe-file vordefinieren? Frage deshalb im Bezug auf Monodevelop, da die .so da erstellt wurde.
Gruß und Frohe Ostern
Maik81ftl
-
maik81ftl schrieb:
sry, das ich den hier noch ü 15 Monate mal eine Frage reinstelle, aber wie schaut es aus, wenn ich eine Libraray für Ubuntu und Win Compalieren will?
Dann stell eine Frage im passenden Forum (Compilerdetails haben nichts mit der Sprache an sich zu tun), anstatt die Toten zu erwecken (auch wenn das Datum dafür gut passt).