C++: fprintf problem mit linux

@devDevil

Ach du schei*e...

Von cout hab ich schon zwar was gelesen, aber den Code da versteh ich überhaupt nicht :confused:

Kann mich einer drüber aufklären? Und am besten ein gutes e-book empfehlen... ?

Ich glaube mir wurde bisher nur mist erzählt :)

Unter Linux braucht er immer noch gut 5 minuten. Laut einem Kollegen ist der grund rand() weil dieser unter Linux besser, bzw "bessere" Zufallszahlen generiert und somit etlich länger dauert.
 
Zuletzt bearbeitet von einem Moderator:
Jo wurde dir auch. Gibt genug gute Bücher ;) Aber leider noch viel mehr schlechte. Aber den genauen Aufbau eines Streams, eines Streambuffers usw. zu erklären ... wäre viel verlangt ;)

Unter Linux braucht er immer noch gut 5 minuten. Laut einem Kollegen ist der grund rand() weil dieser unter Linux besser, bzw "bessere" Zufallszahlen generiert und somit etlich länger dauert.
... machse mal so:
C++:
#include <cstdlib>
#include <ctime>
#include <iostream>

int main()
{
    const std::time_t begin(std::time(NULL));  
    std::cout << "Zufallsgenerator Geschwindigkeitstest\n"

    std::srand(static_cast<unsigned>(begin));
    std::clog << "Zufallszahl: " << std::rand() << "\Zeit: " << std::difftime(begin, std::time(NULL));
}
und auf ms und linux testen ...
 
Hi.

Naja, time() ist ja nun doch etwas zu grobschlächtig für Zeitmessungen.

Wie genau clock() arbeitet kann natürlich unterschiedlich sein, aber CLOCKS_PER_SEC gibt deswegen ja an wieviel "clocks" pro Sek. gezählt werden.

Außerdem vermute ich mal, das nicht rand() sondern clock() verantwortlich für den Geschwindigkeitsunterschied ist. Das sieht man dann auch wenn man dein Programm (ohne die getchar() Aufrufe) unter Linux mit dem time Befehl aufruft:
Code:
$ time ./bench >/dev/null
real	0m59.037s
user	0m31.006s
sys	0m27.306s
Wie man sieht braucht das Programm selbst nur 31 Sek., allerdings verbringt das Programm auch 27 Sek. mit Systemaufrufen. clock() benötigt einen Systemaufruf während rand() nur eine Bibliotheksfunktion ist.

Da wäre jetzt die Frage welcher Timer-Baustein für die clock() Aufrufe unter Windows bzw. Linux zum Einsatz kommt um da etwas vergleichen zu können.

Für das folgende C-Programm erhalte ich unter Linux (AMD Athlon(tm) 64 X2 Dual Core Processor 3800+) einen Wert von 6490ms und unter Windows (Intel Pentium M 1.4GHz) einen Wert von 11304ms ausgegeben.
C:
#include <stdio.h>
#include <time.h>
#include <stdlib.h>

int main () {
  int index;
  printf("Benchmarking Tool\n");

  printf("Fange an zu rechnen. Bitte haben Sie Geduld...\n");
  int startZeit = clock();
  srand (time(NULL));
  for (index=0; index<100000000; index++)
    {

      rand()*rand()+rand()*rand()/3;
    }

  printf("\n_____________\n");
  int Ende = clock()-startZeit;
  printf("%f ms", ((double)Ende) / CLOCKS_PER_SEC * 1000 );

  return 0;
}
Gruß
 
linux:

Code:
Zufallsgenerator Geschwindigkeitstest
Zufallszahl: 1679221876Zeit: 0

und windows:

Code:
Zufallsgenerator Geschwindigkeitstest
Zufallszahl: 952 Zeit: 0

Also das liegt also daran das linux eine größere Zufallszahl generiert. Und da er 100000000 mal es machen muss, dauert es anscheinend viel länger als mit windows.

Wäre es die Lösung es einfach zu begrenzen? Und wenn ja, wie?

edit:

@deepthroat: aber ich brauch dieses abfragen ob eine taste gedrückt wurde.

Außerdem komm ich bei mir auf das selbe Ergebnis wenn ich das weg lasse > ca 5 min. (unter linux)

Und dein Programm da schließt sich bei mir sofort (windows) :)

Und es ist C. Aber ich möchte gerne C++ lernen :) Und damit ich "reines" C++ lernen kann, hab ich extra mit C++ angefangen. Weil ich es nicht hinterher durcheinander bringen will, bzw vom syntax richtig arbeiten will.

Edit2:
Btw, wtf "ist" Sven Uwe? xD
 
Zuletzt bearbeitet von einem Moderator:
Hi.
@deepthroat: aber ich brauch dieses abfragen ob eine taste gedrückt wurde.
Dann nimm's halt wieder rein. Wo ist das Problem? Es war ja nur dazu da die Zeit mit dem time Kommando unter Linux zu messen - und da kann man keine Eingabeabfrage gebrauchen.
Außerdem komm ich bei mir auf das selbe Ergebnis wenn ich das weg lasse > ca 5 min. (unter linux)
Es geht nicht um die Eingabeabfrage, es geht um die clock() Aufrufe in der Schleife. Bitte lies dir nochmal meinen Beitrag richtig durch.
Und dein Programm da schließt sich bei mir sofort (windows) :)
Dann führe es auf der Kommandozeile aus.
Und es ist C. Aber ich möchte gerne C++ lernen :) Und damit ich "reines" C++ lernen kann, hab ich extra mit C++ angefangen. Weil ich es nicht hinterher durcheinander bringen will, bzw vom syntax richtig arbeiten will.
Aha. Dein erstes Programm war aber mehr C als C++. (eigentlich war da alles C außer der C++ Header ctime)
Edit2:
Btw, wtf "ist" Sven Uwe? xD
Such mal im Forum oder bei Google. Sven Uwe war schon sehr... hartnäckig. ;)

Gruß
 
Zuletzt bearbeitet:
Es geht nicht um die Eingabeabfrage, es geht um die clock() Aufrufe in der Schleife. Bitte lies dir nochmal meinen Beitrag richtig durch.
Achso, ok. Probier ich aus.
Edit: Ok, ohne die Clock() aufrufe in der Schleife dauert es nur 39 sekunden auf dem Linux Server :) Wüsste gerne wieso das so ist, kann mir das einer erklären? :)

Dann führe es auf der Kommandozeile aus.
Hab getchar kurzzeitig hinzugefügt. Ergebnis siehe oben :)

Aha. Dein erstes Programm war aber mehr C als C++. (eigentlich war da alles C außer der C++ Header ctime)
Ja, dachte das wär C++ :)
Hab nämlich paar Kollegen gefragt ob jemand C++ kann. Schließlich hat sich einer gemeldet der C++ können soll und hab ihn gefragt ob er mir paar "takte" beibringen könnte. Ergebnis sieht man ja oben :)

Das es C war konnte ich ja nicht wissen. Will C++ ja lernen :)

Das Programm läuft jetzt unter Linux und Windows so wie es soll, herzlichen dank! :)

Zu guter schluß: kann mir einer empfehlen wie ich nun am besten weiter machen um mich in C++ einzusteigern?.

Such mal im Forum oder bei Google. Sven Uwe war schon sehr... hartnäckig.
Laut google, bzw laut den Ergebnissen ist Sven Uwe einer der irgendwie nur nach Programmen usw gefragt hat xD Und das in sehr vielen Foren.
 
Zurück