Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

chrono duration_cast not working when doing arithmetic in cout

I do not understand the following behaviour

unsigned long begin_time = \
    std::chrono::duration_cast<std::chrono::milliseconds>(std::chrono::steady_clock::now().time_since_epoch()).count();

//some code here

std::cout << "time diff with arithmetic in cout: " << \
    std::chrono::duration_cast<std::chrono::milliseconds>(std::chrono::steady_clock::now().time_since_epoch()).count() - begin_time << std::endl;

unsigned long time_diff = \
    std::chrono::duration_cast<std::chrono::milliseconds>(std::chrono::steady_clock::now().time_since_epoch()).count() - begin_time;

std::cout << "time_diff: " << time_diff << std::endl;

Output:

time diff with arithmetic in cout: <very large number (definitely not milliseconds)>
time_diff: <smaller number (definitely milliseconds)>

Why does the duration_cast not work when I do arithmetic within the cout? I have used unsigned int and int for the time_diff variable, but I always get good output when I first do the arithmetic within the variable initialization or assignment.

NOTE

I am using Visual Studio 2013 (Community edition)

like image 428
Konrad Avatar asked Sep 19 '25 13:09

Konrad


1 Answers

You are probably overflowing unsigned long (sizeof is 4):

unsigned long begin_time = \
    std::chrono::duration_cast<std::chrono::milliseconds>(std::chrono::steady_clock::now().time_since_epoch()).count();

Recommended:

using namespace std::chrono;
auto begin_time = steady_clock::now();

//some code here

std::cout << "time diff with arithmetic in cout: " << 
    duration_cast<milliseconds>(steady_clock::now() - begin_time).count() << std::endl;
like image 164
Howard Hinnant Avatar answered Sep 21 '25 03:09

Howard Hinnant