Quelqu'un sait-il comment calculer la différence de temps en C++ en millisecondes? J'ai utilisé difftime
mais il n'a pas assez de précision pour ce que j'essaie de mesurer.
Vous devez utiliser l'une des structures temporelles les plus spécifiques, soit temporelle (résolution en microsecondes) ou temporelle (résolution en nanosecondes), mais vous pouvez le faire manuellement assez facilement:
#include <time.h>
int diff_ms(timeval t1, timeval t2)
{
return (((t1.tv_sec - t2.tv_sec) * 1000000) +
(t1.tv_usec - t2.tv_usec))/1000;
}
Cela a évidemment des problèmes avec le débordement d'entier si la différence de temps est vraiment grande (ou si vous avez des entiers 16 bits), mais ce n'est probablement pas un cas courant.
Je sais que c'est une vieille question, mais il y a une réponse mise à jour pour C++ 0x. Il y a un nouvel en-tête appelé <chrono>
qui contient des utilitaires modernes. Exemple d'utilisation:
#include <iostream>
#include <thread>
#include <chrono>
int main()
{
typedef std::chrono::high_resolution_clock Clock;
typedef std::chrono::milliseconds milliseconds;
Clock::time_point t0 = Clock::now();
std::this_thread::sleep_for(milliseconds(50));
Clock::time_point t1 = Clock::now();
milliseconds ms = std::chrono::duration_cast<milliseconds>(t1 - t0);
std::cout << ms.count() << "ms\n";
}
50ms
Plus d'informations peuvent être trouvées ici:
http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2661.htm
Il existe également désormais une mise en œuvre renforcée de <chrono>
.
si vous utilisez win32 FILETIME est la plus précise que vous pouvez obtenir: Contient une valeur de 64 bits représentant le nombre d'intervalles de 100 nanosecondes depuis le 1er janvier 1601 (UTC).
Donc, si vous souhaitez calculer la différence entre deux fois en millisecondes, procédez comme suit:
UINT64 getTime()
{
SYSTEMTIME st;
GetSystemTime(&st);
FILETIME ft;
SystemTimeToFileTime(&st, &ft); // converts to file time format
ULARGE_INTEGER ui;
ui.LowPart=ft.dwLowDateTime;
ui.HighPart=ft.dwHighDateTime;
return ui.QuadPart;
}
int _tmain(int argc, TCHAR* argv[], TCHAR* envp[])
{
//! Start counting time
UINT64 start, finish;
start=getTime();
//do something...
//! Stop counting elapsed time
finish = getTime();
//now you can calculate the difference any way that you want
//in seconds:
_tprintf(_T("Time elapsed executing this code: %.03f seconds."), (((float)(finish-start))/((float)10000))/1000 );
//or in miliseconds
_tprintf(_T("Time elapsed executing this code: %I64d seconds."), (finish-start)/10000 );
}
La fonction d'horloge vous donne une minuterie en millisecondes, mais ce n'est pas le meilleur. Sa résolution réelle dépendra de votre système. Tu peux essayer
#include <time.h>
int clo = clock();
//do stuff
cout << (clock() - clo) << endl;
et voyez comment sont vos résultats.
Vous pouvez utiliser gettimeofday
pour obtenir le nombre de microsecondes depuis Epoch. Le segment en secondes de la valeur renvoyée par gettimeofday () est le même que celui renvoyé par time () et peut être converti en time_t et utilisé dans difftime. Une milliseconde correspond à 1000 microsecondes.
Après avoir utilisé difftime, calculez vous-même la différence dans le champ de microsecondes.
Vous pouvez obtenir une précision micro et nanoseconde hors de Boost.Date_Time .
Je pense que vous devrez utiliser quelque chose de spécifique à la plate-forme. J'espère que cela n'aura pas d'importance? par exemple. Sous Windows, regardez QueryPerformanceCounter()
qui vous donnera bien mieux que des millisecondes.