2011-10-25 21 views
22

Tengo un problema estúpido. Intento cambiar a los encabezados C++ 11 y uno de esos es chrono. Pero mi problema es que no puedo explicar el resultado de las operaciones de tiempo. Por ejemplo:std :: chrono y cout

auto t=std::chrono::high_resolution_clock::now(); 
cout<<t.time_since_epoch(); 

da:

inicializar el argumento 1 de ‘std::basic_ostream<_CharT, _Traits>& std::operator<<(std::basic_ostream<_CharT, _Traits>&&, const _Tp&) [with _CharT = char, _Traits = std::char_traits<char>, _Tp = std::chrono::duration<long int, std::ratio<1l, 1000000l> >]’ ... /usr/include/c++/4.6/ostream

cout<<(uint64_t)t.time_since_epoch(); 

da un reparto no válido

Respuesta

20

Un rápido google se arco encontró esta página: http://en.cppreference.com/w/cpp/chrono/duration, donde puede encontrar un ejemplo de cómo imprimir una duración.

Editar: ¡Gracias trasladó a http://en.cppreference.com/w/cpp/chrono/duration/duration_cast

+0

uso ese wiki, pero nunca lo encontré ... tnx – NoSenseEtAl

+0

Tenga en cuenta que el ejemplo vinculado es diferente porque imprime la diferencia entre dos invocaciones de ahora() y no implica time_since_epoch().De hecho, time_since_epoch deja la época real sin especificar (depende del reloj del que obtuvo el punto de tiempo). Por lo tanto, en resumen, la duración que está imprimiendo es algo sin sentido sin información acompañada sobre la época. –

7

No está seguro de lo que esperas de este reparto, tal vez quería t.time_since_epoch().count()?

29

Como han notado otros, puede llamar a la función de miembro count() para obtener el recuento interno.

Quería agregar que estoy intentando agregar un nuevo encabezado: <chrono_io> a esta biblioteca. Está documentado here. La principal ventaja de <chrono_io> con solo usar count() es que las unidades de tiempo de compilación se imprimen para usted. Por supuesto, esta información se puede obtener manualmente, pero es mucho más fácil tener la biblioteca para usted.

Para mí, tu ejemplo:

#include <iostream> 
#include <chrono_io> 

int main() 
{ 
    auto t = std::chrono::high_resolution_clock::now(); 
    std::cout << t.time_since_epoch() << '\n'; 
} 

Salidas:

147901305796958 nanoseconds 

El código fuente para hacer esto es de código abierto y está disponible en el enlace de arriba. Se compone de dos encabezados: <ratio_io> y <chrono_io>, y 1 fuente: chrono_io.cpp.

Este código debe considerarse experimental. No es estándar, y casi con seguridad no estará estandarizado como está. De hecho, los comentarios preliminares del LWG indican que preferirían que la salida por defecto fuera lo que este software llama la "forma abreviada". Esta salida alternativa se puede obtener con:

std::cout << std::chrono::duration_fmt(std::chrono::symbol) 
      << t.time_since_epoch() << '\n'; 

y salidas:

147901305796958 ns 
+0

Por mi pregunta original, puede adivinar que no soy un gurú de cpp :), pero ¿por qué no sobrecarga time_since_epoch t.time_since_epoch (chrono :: print_unit) – NoSenseEtAl

+1

En este momento hay muy pocos crono gurus en el planeta. ¡Entonces lo estás haciendo bien! :-) Pude haber malinterpretado su sugerencia, pero parece que está sugiriendo establecer las unidades de la duración, al menos para propósitos de impresión. Esto podría causar conversiones inexactas para que ocurran silenciosamente, lo que el diseño de Chrono ha tenido problemas para evitar. Es decir. diferentes tipos de duración solo se convertirán implícitamente si la conversión no produce un error de truncamiento. –

+0

Lo que quiero decir es que sobrecarga la función y que la sobrecarga devuelve std :: string que tiene la unidad pegada al final. o puede tener diferentes params en lugar de print_unit tener print_nano, print_milli o incluso print_unit ... o simplemente para actualizar (w) cout para tomar (con <<) print_units ... (alias std :: cout << chrono :: print_units << t.time_ ...) mi punto es que la solución de encabezado solo para imprimir correctamente parece desordenada. Y le dará munición a los que odian ... "¿Quieres imprimir la unidad de tiempo? Hay un encabezado, por cierto no se estandarizará durante 5 años". :) – NoSenseEtAl

7

Si quieres tiempo en la resolución de milisegundos esto es cómo puede hacerlo:

auto t1 = std::chrono::high_resolution_clock::now(); 
//process to be timed 
auto t2 = std::chrono::high_resolution_clock::now(); 
std::cout << "process took: " 
    << std::chrono::duration_cast<std::chrono::milliseconds>(t2 - t1).count() 
    << " milliseconds\n"; 

Don' se olvide de agregar entre los encabezados incluidos:

#include <chrono> //timing 
Cuestiones relacionadas