millisekunden



  • boost::timer


  • Administrator

    @FreakY,
    Du hast es zwar zum Teil schon genannt, aber ich würde da gerne noch ein paar Zusätze bringen:
    1. Sleep(1) gibt absolut keine Garantie, dass auch wirklich eine Millisekunde geschlafen wird. Es heisst nur im Minimum, das ist alles. Grundsätzlich wäre es möglich, dass das Programm noch 2 Stunden weiterschläft 😉
    2. Wie willst du damit eine Zeit messen? Du kannst einen Timer machen, aber du kannst keine Start- und Endzeit nehmen.
    3. system("cls") ist EXTREM zeitraubend. Es braucht ca. 20 - 30 Millisekunden! Nur einer der Gründe, wieso man eben auf ein system Call verzichten sollte, wo nur möglich.
    4. std::cout kann man beschleunigen, durch das Hinzufügen eines Puffers.

    #include <iostream>
    
    int main()
    {
      std::size_t const COUT_BUFFER_SIZE = 4096;
      char coutBuffer[COUT_BUFFER_SIZE];
    
      std::cout.rdbuf()->pubsetbuf(coutBuffer, COUT_BUFFER_SIZE);
    
      // Arbeiten mit std::cout wie normal.
    
      // ...
    
      // std::cout wieder ungepuffert machen:
      std::cout.rdbuf()->pubsetbuf(0, 0);
    
      return 0;
    }
    

    6. Statt system("cls") kannst du für deinen speziellen Fall ein ähnliches Verhalten auslösen mit dem Carriage Return. Zumindest auf Windows, bei anderen Betriebsystemen habe ich es noch nicht probiert:

    std::cout << '\r'; // Überschreibe aktuelle Zeile.
    std::cout << "Was auch immer!";
    

    Gerade bei einem Timer, wo es bei 0 anfängt und die Zahl immer wie grösser wird, ist das natürlich sehr praktisch. So bleiben auch nie irgendwelche Überreste der vorherigen Zeile auf der Konsole. Und es geht natürlich nur, für die eine aktuelle Zeile.

    Aber wie schon gesagt wurde. Auf Vista, bzw. Windows, empfiehlt es sich QueryPerformanceCounter einzusetzen. Oder vielleicht noch Boost.DateTime, allerdings ich weiss nicht, wie die Leute dort, die Auflösung der Millisekundenuhr hinbekommen haben. Auch noch eine Möglichkeit wäre timeGetTime , aber wenn du auf Windows bist, dann kannst du eigentlich gleich QueryPerformanceCounter nehmen.

    Grüssli



  • Dravere schrieb:

    2. Wie willst du damit eine Zeit messen? Du kannst einen Timer machen, aber du kannst keine Start- und Endzeit nehmen.
    3. system("cls") ist EXTREM zeitraubend. Es braucht ca. 20 - 30 Millisekunden! Nur einer der Gründe, wieso man eben auf ein system Call verzichten sollte, wo nur möglich.

    Es war nur ein Grundgerüst, da der OP anscheinend keine Ahnung hatte, wie er anfangen soll.
    Und zu system habe ich doch geschrieben das es zeitraubend ist. Aber trotzdem gut das du noch einiges erwähnt hast.



  • @FreakY<3Cpp:
    Sleep() ist kein Standard C++ und dein Code ist kein Grundgerüst condern zu 100% Humbug.

    @simon773:
    Unter Windows kannst du neben QueryPerformanceCounter auch noch GetTickCount und timeGetTime verwenden. GetTickCount springt üblicherweise in 16ms Schritten (je nach OS mehr oder weniger), und die Genauigkeit von timeGetTime lässt sich über timeBeginPeriod einstellen (bis auf min. 2ms runter).



  • Dravere schrieb:

    6. Statt system("cls") kannst du für deinen speziellen Fall ein ähnliches Verhalten auslösen mit dem Carriage Return. Zumindest auf Windows, bei anderen Betriebsystemen habe ich es noch nicht probiert:

    std::cout << '\r'; // Überschreibe aktuelle Zeile.
    std::cout << "Was auch immer!";
    

    Gerade bei einem Timer, wo es bei 0 anfängt und die Zahl immer wie grösser wird, ist das natürlich sehr praktisch. So bleiben auch nie irgendwelche Überreste der vorherigen Zeile auf der Konsole. Und es geht natürlich nur, für die eine aktuelle Zeile.

    Ah, wie genial! Das wusste ich noch nicht. Vielen Dank - das werd ich wohl oefter gebrauchen koennen 🙂 (zur plattformunabhaengigkeit: ist das nicht standardisiert?)

    Gruss
    Cartman



  • Eric Cartman schrieb:

    Ah, wie genial! Das wusste ich noch nicht. Vielen Dank - das werd ich wohl oefter gebrauchen koennen 🙂 (zur plattformunabhaengigkeit: ist das nicht standardisiert?)

    ich habs bis vor wenigen minuten auf linux benutzt.



  • volkard schrieb:

    Eric Cartman schrieb:

    Ah, wie genial! Das wusste ich noch nicht. Vielen Dank - das werd ich wohl oefter gebrauchen koennen 🙂 (zur plattformunabhaengigkeit: ist das nicht standardisiert?)

    ich habs bis vor wenigen minuten auf linux benutzt.

    Danke fuer die Info, also ist es plattformunabhaengig, das wollt ich wissen 🙂

    Gruss
    Cartman



  • Dravere schrieb:

    1. std::cout kann man beschleunigen, durch das Hinzufügen eines Puffers.

    Nur um den TO nicht zu verwirren: std::cout ist doch standardmässig gepuffert. Du kannst natürlich nachträglich die Puffergröße ändern.


  • Administrator

    Aquae schrieb:

    Nur um den TO nicht zu verwirren: std::cout ist doch standardmässig gepuffert. Du kannst natürlich nachträglich die Puffergröße ändern.

    Nein, es gibt leider keine Garantie, dass std::cout per Standard gepuffert ist. Typisches Beispiel ist die Dinkumware Standardbibliothek, die hat keine Pufferung drin. Sie wird zum Beispiel vom MSVC eingesetzt.
    Wie kommst du überhaupt darauf, sowas zu behaupten?

    Grüssli



  • Nunja, wie ich dazu komme... der unwissenschaftliche Weg, ich gebe es zu. Rein aus Erinnerung.
    Aber du hast Recht, der Standard verliert kein Wort darüber, dass cout gepuffert sein muss. Das Objekt muss nur existieren.

    Und ich kann mich nicht mal rauswinden, dass das doch quasi alle Compiler-Hersteller gepuffert machen, hmm.



  • danke an alle!!
    hab mit QueryPerformanceCounter gefunden, was ich suchte 🙂



  • Dravere schrieb:

    Wie kommst du überhaupt darauf, sowas zu behaupten?

    Ist es so speziell, wenn jemand mal einen Fehler macht? Es kommt doch bei uns allen ab und zu vor, dass wir von einer Annahme ausgehen, ohne diese genau hinterfragt zu haben. Gerade in C++, wo so viele Dinge verschwommen und implementation-defined sind. 🙂


  • Administrator

    Nexus schrieb:

    Dravere schrieb:

    Wie kommst du überhaupt darauf, sowas zu behaupten?

    Ist es so speziell, wenn jemand mal einen Fehler macht? Es kommt doch bei uns allen ab und zu vor, dass wir von einer Annahme ausgehen, ohne diese genau hinterfragt zu haben. Gerade in C++, wo so viele Dinge verschwommen und implementation-defined sind. 🙂

    Ne, ich dachte er hätte es irgendwo gelesen oder so. Dann könnte man dieses Buch oder Tutorial auf die schwarze Liste nehmen oder den Autoren anschreiben.
    War also gar nicht gegen Aquae gerichtet, mir ging es nur um die Information, woher er dies hat. Es ist nämlich fast schon eine standardisierte Fehlannahme 😃

    Grüssli



  • Gut, dann hab ich das falsch verstanden, sorry.

    Dravere schrieb:

    standardisierte Fehlannahme 😃

    Hm, da gibts aber einige davon. Das wäre mal was für ein Buch. :p


Anmelden zum Antworten