2012-02-08 8 views
9

Sto usando boost::posix_time::ptime per misurare il mio tempo di esecuzione della simulazione e qualcos'altro.ottenere boost :: posix_time :: time_duration in secondi

assuimg

boost::posix_time::ptime start, stop; 
boost::posix_time::time_duration diff; 
start = boost::posix_time::microsec_clock::local_time(); 
sleep(5); 
stop = boost::posix_time::microsec_clock::local_time(); 
diff = stop - stop; 

ora

std::cout << to_simple_string(diff) << std::endl; 

ritorno l'ora nel formato hh:mm:ss.ssssss e vorrei avere il tempo così in ss.sssssss.

per fare questo, ho provato

boost::posix_time::time_duration::sec_type x = diff.total_seconds(); 

ma che mi ha dato la risposta in formato ss e seconds() Rendimenti numero normalizzato di secondi (0..60).

La mia domanda, come posso ottenere il tempo di simulazione in secondi del formato ss.ssssss?

EDIT

sono stato in grado di fare:

std::cout << diff.total_seconds() << "." << diff.fractional_seconds() << std::endl; 

c'è qualcosa di elegante che potrebbe tracciare ss.sssssss?

risposta

14

total_seconds() restituisce un valore long che non è normalizzato a 0..60s.

Quindi solo fare questo:

namespace bpt = boost::posix_time; 

int main(int , char**) 
{ 
    bpt::ptime start, stop; 
    start = bpt::microsec_clock::local_time(); 
    sleep(62); 
    stop = bpt::microsec_clock::local_time(); 

    bpt::time_duration dur = stop - start; 

    long milliseconds = dur.total_milliseconds(); 

    std::cout << milliseconds << std::endl; // 62000 

    // format output with boost::format 
    boost::format output("%.2f"); 
    output % (milliseconds/1000.0); 
    std::cout << output << std::endl; // 62.00 
} 
+0

grazie per il vostro replay. Secondo il tuo esempio, vorrei il seguente output: 62.0000 (ss.ssssss). Potrebbe essere possibile? – Eagle

+0

@Eagle: ho aggiunto un esempio con l'output desiderato usando 'boost :: format'. Spero che sia d'aiuto. – nabulke

1

Il modo più straight-forward che vedo è qualcosa di simile a questa uscita, il resto dei calcoli temporali lungo le linee di post di nabulke:

#include <iomanip> 
double dseconds = dur.total_milliseconds()/1000. ; 

std::cout << std::setiosflags(std::ios::fixed) << std::setprecision(3); 
std::cout << dseconds << std::endl; 

Volete esprimere il tempo in termini di numero in virgola mobile, quindi probabilmente è meglio usarne uno e applicare i manipolatori standard di formattazione dello stream.

+0

ha funzionato, hai ragione. L'ho provato da solo, ma ho dimenticato il "." .... quindi ho ottenuto il numero intero – Eagle

1
// whatever time you have (here 1second) 
boost::posix_time::ptime pt = boost::posix_time::from_time_t(1); 
// subtract 0 == cast to duration 
boost::posix_time::time_duration dur = pt - boost::posix_time::from_time_t(0); 
// result in ms 
uint64_t ms = dur.total_milliseconds(); 
// result in usec 
uint64_t us = dur.total_microseconds(); 
// result in sec 
uint64_t s = dur.total_seconds(); 
std::cout << "s = " << s << ", ms = " << ms << ", us = " << us << std::endl; 

s = 1, ms = 1000, ci = 1000000

Problemi correlati