2012-02-08 22 views
9

Estoy usando boost::posix_time::ptime para medir el tiempo de ejecución de mi simulación y para otra cosa.get boost :: posix_time :: time_duration en segundos

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; 

ahora

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

retorno el momento en hh:mm:ss.ssssss formato y me gustaría tener el tiempo, así como en ss.sssssss.

para hacer esto, he intentado

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

pero eso me dio la respuesta en formato de SS y seconds() devuelto Devuelve el número de segundos normalizado (0..60).

Mi pregunta, ¿cómo puedo obtener mi tiempo de simulación en segundos del formato ss.ssssss?

EDITAR

yo era capaz de hacer:

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

¿hay algo elegante que podría trazar ss.sssssss?

Respuesta

14

total_seconds() devuelve un valor de long que no está normalizado a 0.60 s.

Así que hacer esto:

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

gracias por su repetición. De acuerdo con su ejemplo, me gustaría obtener la siguiente salida: 62.0000 (ss.ssssss). ¿Seria posible? – Eagle

+0

@Eagle: Agregué un ejemplo con su salida deseada usando 'boost :: format'. Espero eso ayude. – nabulke

1

La manera más directa de lo que veo es algo parecido a esta salida, el resto de los cálculos de tiempo a lo largo de las líneas de entrada de nabulke:

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

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

Desea expresar el tiempo en términos de un número de punto flotante, por lo que probablemente sea mejor utilizar uno y aplicar los manipuladores de formato de flujo estándar.

+0

funcionó, tienes razón. Lo intenté yo mismo, pero olvidé el "." .... así que obtuve un número entero – 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, m = 1,000, nosotros = 1000000

Cuestiones relacionadas