Also fprintf ist so weit ich weis sowieso standardmäßig gepuffert oder irre ich mich da? So, dass die Dateiausgabe kaum schneller werden würde. Mag sein, dass der Puffer jedoch nicht wirklich groß ist.
Printf ist in dem Fall nur teils gepuffert, es wird nicht jedes Zeichen einzeln ausgegeben sondern nur jede Zeile, da bei jedem \n der Puffer geleert wird.
Jedoch will ich, dass die Ausgabe zeilenweise geschieht und wüsste nicht wie man das am geschicktesten macht. Wenn ich nun ein Ganzzahlen Array nehme da die Ergebnisse sammele und dann jede Zahl ausgebe, habe ich im Endeeffekt die selbe ungepufferte Ausgabe. Wenn ich das jedoch in einem großen String sammele müsste ich die Zahlen immer erst in Strings umwandeln und ich bin mir nicht ganz sicher, wie printf dann reagiert wenn da \n drin sind.
Zitat:
Ich schreibe die Ausgabe in ein Array (wurde ja schon gesagt) und starte einen parallelen Thread, der die Daten ausliest und auf den Bildschirm bringt... Zwar braucht der Ausgabethread manchmal etwas mehr Zeit als der Berechungsthread aber das macht ja nix.
Joa habe sowieso mit dem Gedanken gespielt, das Programm in Threads zu zerlegen, so könnte jede zweite Zahl die getestet wird von einem Thread und die anderen Zahlen von dem anderen Thread berechnet werden (bisher läuft es auch auf Multicoresystemen nur auf einem). Das Problem ist ich weis jedoch nicht genau wie man Threads nutzt, da ich mich damit bisher recht wenig beschäftigt habe.
Zitat:
Uhhh... Das kann sehr blöd ausgehen, wenn jemand nur wenig Arbeitsspeicher hat, und die zu berechnenden Zahlen hoch eingestellt sind! Vielleicht sollte der Buffer alle x Sekunden in die Datei geschrieben werden...
Wenn dann würde das Array sowieso eine Maximalgröße besitzen (die nicht so groß ist, dass es zu Problem führen sollte), denn wenn ich hier einen dynamischen Puffer nutzen würde, könnte es durch das ständige Ändern der Größe unter Umständen dazu führen, dass das Programm im nachhinein sogar langsamer werden würde. Und wenn würde das eher bei kleineren Zahlen zum Problem werden, denn je höher die Zahlen, desto langsamer das Programm, da viel mehr getestet wird und desto schneller läuft der Puffer voll. Eine Zeitgesteuerte Ausgabe wäre hier sowieso das sinnvollste, die jede Sekunde (oder beim erreichen des Maximums) den Puffer leert.
Zitat:
Ob die Zahlen in der Konsole ausgegeben werden oder in einem Array gespeichert sind, dürfte doch Speichertechnisch fast egal sein?
Falsch, da die Konsole eine feste Größe besitzt, nämlich 80 Spalten und wenn ich mich nicht irre in dem Fall ca. 250 Zeilen. Bei einem Array kann man jedoch unzählige Zeilen nutzen und man könnte innerhalb einer Sekunde zick Tausend solcher Zeilen füllen, wobei die Größe dennoch recht klein ist, man kann ja mal die Dateiausgabe starten und schauen wie groß das etwa wird.
Naja wenn mir mal langweilig ist, schau ich mal ob ich es schaffe die Ausgabe zu puffern und vielleicht das Programm in Threads zu zerlegen.
Gerade weil die Ausgabe das Programm so verlangsamt habe ich ja die Möglichkeit bereitgestellt die Konsolenausgabe zu deaktivieren.
Aber weis vielleicht einer wieso das Programm auf Intel CPUs im Gegensatz zu AMD CPUs soo viel schneller läuft? Meines Wissen waren die AMD CPUs ja gerade beim Teilen recht flott verglichen zu den Intel CPUs.
Edit: Ursprünglich wollte ich das ganze ja mit unsigned long long machen, da diese eine größere Genauigkeit bieten (über 32bit). Jedoch alles was ich auch versuchte schienen diese nur eine Genauigkeit von 32 bit genauso wie unsigned long zu haben. Könnte das ggf. daran liegen, dass mein Betriebssystem nur mit 32bit umgehen kann? Und ich das auf einem 64 Bit System kompilieren müsste, damit ich die höhere Genauigkeit (ggf. 64 bit, je nach Kompiler) erreichen kann.