2017-04-09 70 views
2

有人能幫我找出差異在哪裏嗎?因爲第一代碼:std :: chrono不同的結果 - 固定的時間步進循環

#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; 
     } 
    } 
} 

輸出:30,和一個第二代碼:

#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; 
     } 
    } 
} 

輸出:60;

唯一的區別是在第二個示例中使用「結束」變量。在我看來,它不應該造成這樣的差異。我的意思是,不是steady_clock :: now()與end = steady_clock :: now()完全相同?

回答

2

不同的是,這裏

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

now()返回2個不同的值的兩個實例,從而counter不會是同步於accumulator和下一如果條件將觸發一個迭代前面相比

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

因爲這兩個,accumulatorcounter增加了相同的數額。

您可以通過改變兩個語句的順序驗證這

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

,將產生相當變幻莫測輸出in my case i got a 117

做得更可讀的代碼我會寫這樣的:

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

這是一件好事,以避免輸入一次完全一樣的東西更多。在這種情況下,真正重要的是它們增加了相同的數量,所以爲什麼不在代碼中明確表示?!

TL; DRsteady_clock::now()是「相同」的end = steady_clock::now(),但steady_clock::now()當你調用它兩次不會返回相同的值。

+0

我忽略了它。謝謝你的快速回復。現在一切都很清楚。 :) –