Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » Compiler rundet?

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
22.09.2008, 11:27 Uhr
~testo
Gast


Hallo,

ich habe eine Zeitmessung so gemacht:


Code:
clock_gettime(CLOCK_REALTIME, &tp);
    start = 1e9 * tp.tv_sec + tp.tv_nsec;

    //....

    clock_gettime(CLOCK_REALTIME, &tp);
    stop = 1e9 * tp.tv_sec + tp.tv_nsec;
    time = (stop - start) * 1e-9;

    std::cout << "\t" << time <<  "\t[sec]" << std::endl;




Auf der einen maschine wird time wirklich als z.B. 2.12098 ausgegeben.
Auf der anderen dann aber IMMER abgerudnet auf 2.12.
Das will ich nicht.

Alleine schon die differenz stop-start ist dann gerundet auf 2.12e+09 oder so ähnlich.
Wie kann ich dieses problem umgehen und IMMER eine 5-stellige rundung haben also das ich immer 5 nachkommastellen haben.

Ich habe es mit den C++ std::setw bzw. setprecision versucht aber auch da wird abgerundet. Könnnte es an der Locale liegen?
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
22.09.2008, 12:19 Uhr
ao

(Operator)


Mit "Nanosekunden-genauer" Zeitrechnung lügt man sich so leicht einen in die Tasche, und dass der Datentyp theoretisch Nanosekunden darstellen kann, heißt noch lange nicht, dass er es tut.

5 Nachkommastellen, d.h. du willst eine Auflösung von 10 Mikrosekunden. Geht das mit deinem System überhaupt? Oder misst du da nur noch die Interrupt-Latenzen und Threadwechsel-Zeiten?

Auf den üblichen Standard-Betriebssystemen ist die Millisekunde noch halbwegs exakt, und alles, was darunter liegt, ist nur Rauschen. Mit einem Echtzeit-Kern kommt man bis in den Mikrosekunden-Bereich, und was noch genauer sein muss, geht im Grunde nur mit spezieller Zähl-Hardware, das ist aber gedacht für die Messung externer Ereignisse und nicht für Software-Laufzeiten.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
22.09.2008, 12:40 Uhr
~testo
Gast


Danke für den Hinweis - und du hast natürlich recht.
Ich weiß auch gar nicht wie ich es machen sollte anders - dachte daher an folgendes:
Die Zeitmessung schon so zu machen um den algorithmus aber dafür den algorithmus z.B. >100 mal laufen zu lassen und am ende zu mitteln. Bringt das auch verfälschte ergebnisse?
Außerdem kann der Algorithmus durchaus mehrere sekunden laufen.

Mein Problem ist ja nicht die Zeitmessung sondern dass hier abgerundet wird auf dem einen system ohne das ich es explizit will...gibt es dafür eine Lösung?
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
22.09.2008, 13:07 Uhr
ao

(Operator)



Zitat von ~testo:
Die Zeitmessung schon so zu machen um den algorithmus aber dafür den algorithmus z.B. >100 mal laufen zu lassen und am ende zu mitteln. Bringt das auch verfälschte ergebnisse?

Kommt drauf an.

Z.B., ob der Algorithmus Wechselwirkungen mit dem Betriebssystem hat (Plattenzugriffe, Netzwerkzugriffe, ...) - hier können Wartezeiten entstehen. Wenn er nichts dergleichen macht und nur auf dem Speicher herumarbeitet, dann kann man das wahrscheinlich ausschließen.

Außerdem hat natürlich die aktuelle Grundlast des Betriebssystems einen Einfluss. Du misst die Zeit zwischen Anfang und Ende, aber du weißt nicht, für wie lange die Ausführung unterbrochen wird, weil das OS auch andere Dinge tun muss.

Welches Betriebssystem ist es denn?

Zitat:
Außerdem kann der Algorithmus durchaus mehrere sekunden laufen.

Dann - behaupte ich - sind die Mikrosekunden ohne Bedeutung.

Zitat:
Mein Problem ist ja nicht die Zeitmessung sondern dass hier abgerundet wird auf dem einen system ohne das ich es explizit will...gibt es dafür eine Lösung?

Das reich ich mal weiter an die Kollegen, die sich mit cout besser auskennen.

Dieser Post wurde am 22.09.2008 um 13:09 Uhr von ao editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
22.09.2008, 13:39 Uhr
~testo
Gast



Zitat:

Welches Betriebssystem ist es denn?



ist ein gentoo system. auf einem anderen gentoo system "funktioniert es" eben. auch auf dem dritten ubuntu system.

der algorithmus arbeitet "nur" mit dem Hauptspeicher zusammen. Also keine netzzugriffe und auch keine sonstige wechselwirkung. Außerdem versuche ich nichts nebenbei laufen zu lassen...

danke für die Hilfe.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: