如何测量亚秒的持续时间?

时间:2016-01-04 01:59:23

标签: c++ windows datetime time

在我类似计算器的程序中,用户选择计算的数量和数量(例如,pi的位数,素数等等)。我使用time(0)来检查为了触发超时条件而经过的计算时间。如果计算没有超时完成,我还将打印所计算的计算时间,其值存储在double中,返回类型为difftime()

我刚发现计算出的时间值仅以秒为单位。我不希望用户输入100和10000的结果都打印0e0秒的计算持续时间。我希望它们分别打印1.23e-64.56e-3秒的持续时间(与机器可以测量的一样准确 - 我更熟悉Java中提供的准确性以及科学测量的准确性所以这是个人偏好。)

我已经看到了其他问题的答案,但它们没有帮助,因为1)我不会是多线程(在我的工作环境中不是首选)。 2)我不能使用C ++ 11或更高版本。

如果给定所述约束条件,我如何获得比秒数更精确的持续时间值作为整数值?

编辑:平台&机器无关的解决方案首选,否则Windows会做,谢谢!

编辑2:我的笔记本电脑也没有连接到互联网,因此没有像Boost那样下载外部库(Boost是什么?)。我必须自己编码。

3 个答案:

答案 0 :(得分:3)

您可以使用作为Windows API一部分的QueryPerformanceCounter (QPC)来进行高分辨率时间测量。

LARGE_INTEGER StartingTime, EndingTime, ElapsedMicroseconds;
LARGE_INTEGER Frequency;

QueryPerformanceFrequency(&Frequency); 
QueryPerformanceCounter(&StartingTime);

// Activity to be timed

QueryPerformanceCounter(&EndingTime);
ElapsedMicroseconds.QuadPart = EndingTime.QuadPart - StartingTime.QuadPart;


//
// We now have the elapsed number of ticks, along with the
// number of ticks-per-second. We use these values
// to convert to the number of elapsed microseconds.
// To guard against loss-of-precision, we convert
// to microseconds *before* dividing by ticks-per-second.
//

ElapsedMicroseconds.QuadPart *= 1000000;
ElapsedMicroseconds.QuadPart /= Frequency.QuadPart;

答案 1 :(得分:2)

在Windows上,最简单的解决方案是使用GetTickCount,它返回自计算机启动以来的毫秒数。

#include <windows.h>

... 

DWORD before = GetTickCount();
... 
DWORD duration = GetTickCount() - before;
std::cout<<"It took "<<duration<<"ms\n";

注意事项:

  • 仅适用于Windows;
  • 分辨率(毫秒)不是恒星;
  • 假设结果是32位整数,它会在一个月之后回绕;因此,你不能测量比这更长的东西;一个可能的解决方案是使用GetTickCount64,但只能从Vista开始使用;
  • 由于正常运行时间超过一个月的系统实际上很常见,您可能确实需要处理大于2 31 的结果;因此,请确保始终将这些值保留在DWORD(或uint32_t)中,而不将其转换为int,否则您将冒着有符号整数溢出的风险。另一种选择是将它们存储在64位有符号整数(或双精度)中,并且忘记处理无符号整数的困难。

答案 2 :(得分:1)

我意识到您使用的编译器并不支持它,但出于参考目的,C ++ 11解决方案很简单......

auto start = std::chrono::high_resolution_clock::now();
auto end = std::chrono::high_resolution_clock::now();

long ts = std::chrono::duration<long, std::chrono::nano>(end - start).count();