clock() verhält sich seltsam



  • Stiefel2000 schrieb:

    Ich habe ja nicht von der kleinsten Double-Zahl gesprochen - mir ist schon klar, dass man nichts so genau messen kann. Vermutlich ist die Zeit gequantelt und kann ohnehin nicht in kleinere Pakete als vielleicht 10^-50 zerfallen (da hilft also auch kein Star Trek 😉 ).

    Das double, an das ich dachte, wäre ein realistischeres: 1.0000000000000001 z.B., das liegt (hoffentlich) in der double-Genauigkeit und kann trotzdem noch zum Messen großer Zahlen dienen. Die e-308 bekommt man doch nur hin, wenn vor dem Komma eine Null steht.

    zeiten kommen aus der hardware immer als ganzzahlen. und das ist auch bis auf weiteres gut so. zeitdifferenzen und zeitvergleiche dauern einen takt.
    jedem steht es frei, für seine anwendung doubles draus zu machen, zum beispiel

    inlien double dclock(){return clock()/double(CLOCKS_PER_SEC)}
    

    du brauchst keinen double, sondern eine clock()-ähnliche funktion, die mehr takte hat.



  • volkard schrieb:

    du brauchst keinen double, sondern eine clock()-ähnliche funktion, die mehr takte hat.

    Einverstanden.



  • sag dann noch schnell, welches betriuebssystem du benutzt. dann wird sich einer finden, der das auch benutzt und dir die spezielle funktion sagen kann.
    oder du willst gleich alle betriebssysteme abdecken, dann wird's bestimmt was in boost geben, was du nehmen kannst.



  • Ich nutze normalerweise: Ubuntu 9.04 64 Bit (steht schon weiter oben), Windows XP SP3 32 Bit oder Windows Vista SP1 64 Bit.

    "Boost" sagt mir allerdings gar nichts, aber natürlich würde ich gern alle Systeme abdecken :).

    EDIT: Ich bin gerade auf die Seite "boost.org" gestoßen (falls du das meintest), ich lese da aber immer nur von C++, ich selbst benutze eigentlich C.



  • Stiefel2000 schrieb:

    EDIT: Ich bin gerade auf die Seite "boost.org" gestoßen (falls du das meintest), ich lese da aber immer nur von C++, ich selbst benutze eigentlich C.

    mist, ich war im falschen forum wildern. ich bin c++.
    linux gettimeofday()
    windows QueryPerformanceCounter()
    beide schaffen mindestens mikrosekunden.
    jetzt kommt auch dein double ins spiel.
    bau

    double getDoubleTime()
    

    und inndnedrun mit

    #idfef __LINUX
    

    oder so, daß es mit win und linux geht und dir einfach nur nen double in sekunden liefert. nur so als vorschlag. 😃



  • 10^-6 also? Das klingt gut, schonmal danke für deine Hilfe.
    Ich gehe jetzt erstmal ins Bett und probiere das morgen mal aus.

    Kann ich das ganze trotzdem einigermaßen allgemein halten? Gibt es zum Beispiel eine Umgebunsvariable, die mir sowas wie "WIN" oder "LINUX" zurückgibt? Dann sollte eine kleine if-Abfrage ja ausreichen.

    EDIT: Da hast du meine Frage ja schon beim Stellen beantwortet - nochmal danke! 🙂



  • Stiefel2000 schrieb:

    Kann ich das ganze trotzdem einigermaßen allgemein halten? Gibt es zum Beispiel eine Umgebunsvariable, die mir sowas wie "WIN" oder "LINUX" zurückgibt? Dann sollte eine kleine if-Abfrage ja ausreichen.

    mußt da #ifdef nehmen. denn unter win mußt du andere header inkludieren als unter linux. also auch schon das #include <windows.h> oder das linuxische pendant stehen in #ifdef.
    der compiler weiß, welches das zielsystem ist und setzt entsprechende makros als definiert. bin jetzt nicht sicher, daß __LINUX das eine da war. irgend wie so ähnlich wars.



  • Stiefel2000 schrieb:

    10^-6 also? Das klingt gut

    nur als anmerkung, falls du spaß am kleinigkeitenoptimieren finden willst:
    mit RDTSC bist du auf 10^-9. unter win einfach mit (wenn ich mich recht erinnere)

    unsigned long long rdtsc(){
       __asm rdtsc;
    }
    

    gibt die seit dem letztren aufruf vergangenen prozessortakte an. allerdings gehts schief, wenn dein thread zwischendurch den prozessor wechselt. und nicht zu vergessen, daß das auslesen selber (bei mir) 26 takte dauert. die mußt du vorher (zur laufzeit, wäre schon netter!) genau ausmessen und dann abziehen.
    RDTSC ist aber gar nicht einfach auszuwerten, weil da so hundsgemein viele störende effekte die zeiten verschmieren.



  • Stiefel2000 schrieb:

    Gibt es zum Beispiel eine Umgebunsvariable, die mir sowas wie "WIN" oder "LINUX" zurückgibt?

    MSVC definiert selbständig WIN32 in den Projekteinstellungen, bei PellesC z.B. musst du das selber eintragen.



  • Ich will jetzt mal die Zeitfunktionen unter Windows und Linux ausprobieren, ich hoffe, dass sich das als nicht zu schwierig herausstellen wird.
    RDTSC klingt natürlich sehr interessant, sollte ich irgendwie damit klarkommen, werde ich das nutzen ;).

    @volkard: Könntest du evt. ein paar Code-Schnipsel angeben, also sozusagen eine grobe Anleitung, wie ich RDTSC nutzen muss?

    Alternativ wäre es auch nett, wenn mir jemand sagen könnte, auf welcher Website man Informationen über die spezifischeren include-Dateien finden kann. Bisher kam ich mit cplusplus.com immer sehr gut klar, aber dort finden sich nur die allgemeineren Informationen. Per google stoße ich auf ziemlich "zersplitterte" Seiten, ein einigermaßen übersichtliches Archiv ist mir noch nicht untergekommen.

    @Hausschuh2009: Visual Studio stünde mir zwar zur Verfügung, aber das Programm ist doch extrem aufgebläht. Für meine bisher sehr kleinen Programme ist mir ein viele GB umfassendes Programm einfach zu groß.
    Ich habe irgendwas von einer abfragbaren PATH-Variable gelesen - vielleicht lässt sich ja darüber das Betriebssystem bestimmen? Immerhin sehen die Pfade unter Windows und Linux verschieden aus.

    EDIT: gettimeofday() gefällt mir sehr gut, Mikrosekundengenau! 🙂 Das Windows-Äquivalent scheint etwas komplizierter zu sein, mal schauen, wie das läuft.

    EDIT2: Ich habe noch mehr mit gettimeofday() getestet und festgestellt, dass ich vorläufig nur Zeiten unter einer Sekunde stoppen kann, danach beginnt der Zähler wieder bei 0. Kann ich das umgehen?

    EDIT3: Ok, das Problem hat sich erledigt - tv_sec und tv_usec speichern verschiedene Werte, mit etwas Rechnerei kann man also auch die ganzen Sekunden unterscheiden.


Anmelden zum Antworten