2017-04-09 2 views
2

Könnte mir jemand helfen, herauszufinden, wo der Unterschied ist? Da erster Code:Std :: Chrono verschiedene Ergebnisse - feste Zeit Schrittschleife

#include <iostream> 
#include <chrono> 
#include <ratio> 

using namespace std::chrono; 

const nanoseconds timePerFrame = duration_cast<nanoseconds>(duration<steady_clock::rep, std::ratio<1, 60>>(1)); 
nanoseconds accumulator(0); 
nanoseconds counter(0); 
steady_clock::time_point begin; 
int i = 0; 

int main() 
{ 
    while(true) 
    { 
     begin = steady_clock::now(); 
     while(accumulator >= timePerFrame) 
     { 
      accumulator -= timePerFrame; 
      ++i; 
     } 
     accumulator += steady_clock::now() - begin; 
     counter += steady_clock::now() - begin; 
     if(counter >= seconds(1)) 
     { 
     std::cout << i << std::endl; 
     break; 
     } 
    } 
} 

Ausgänge: 30, und ein zweiter Code:

#include <iostream> 
#include <chrono> 
#include <ratio> 

using namespace std::chrono; 

const nanoseconds timePerFrame = duration_cast<nanoseconds>(duration<steady_clock::rep, std::ratio<1, 60>>(1)); 
nanoseconds accumulator(0); 
nanoseconds counter(0); 
steady_clock::time_point begin; 
steady_clock::time_point end; 
int i = 0; 

int main() 
{ 
    while(true) 
    { 
     begin = steady_clock::now(); 
     while(accumulator >= timePerFrame) 
     { 
      accumulator -= timePerFrame; 
      ++i; 
     } 
     end = steady_clock::now(); 
     accumulator += end - begin; 
     counter += end - begin; 
     if(counter >= seconds(1)) 
     { 
     std::cout << i << std::endl; 
     break; 
     } 
    } 
} 

Ausgänge: 60;

Der einzige Unterschied ist die Verwendung der Variable "end" im zweiten Beispiel. Meiner Meinung nach sollte es keinen solchen Unterschied verursachen. Ich meine, ist nicht steady_clock :: now() genau das gleiche wie end = steady_clock :: now()?

Antwort

2

Der Unterschied ist, dass hier

accumulator += steady_clock::now() - begin; 
    counter += steady_clock::now() - begin; 

die beiden Instanzen von now() Rückkehr 2 unterschiedliche Werte, so counter gewohnt mit accumulator und dem nächsten, wenn die Bedingung synchron sein wird zuvor eine Iteration auslösen im Vergleich zu

end = steady_clock::now(); 
    accumulator += end - begin; 
    counter += end - begin; 

weil hier sowohl accumulator als auch counter um den gleichen Betrag erhöht werden.

Sie können dies überprüfen, indem Sie die Reihenfolge der beiden Aussagen zu

counter += steady_clock::now() - begin; 
    accumulator += steady_clock::now() - begin; 

ändern, die ganz unvorhersehbare Ausgabe in my case i got a 117 ergibt.

Um den Code noch besser lesbar machen ich es so schreiben würde:

auto delta = end - begin; 
accumulator += delta; 
counter  += delta; 

Es ist immer gut zu vermeiden Eingabe genau die gleiche Sache mehr als einmal. In diesem Fall ist es wirklich wichtig, dass sie um den gleichen Betrag erhöht werden, also warum nicht im Code explizit machen ?!

TL; DRsteady_clock::now() ist „das gleiche“, wie end = steady_clock::now(), aber steady_clock::now() wird nicht den gleichen Wert zurück, wenn Sie es zweimal aufrufen.

+0

Ich habe es übersehen. Danke für eine schnelle Anprobe. Jetzt ist alles klar. :) –

Verwandte Themen