在我类似计算器的程序中,用户选择计算的数量和数量(例如,pi的位数,素数等等)。我使用time(0)
来检查为了触发超时条件而经过的计算时间。如果计算没有超时完成,我还将打印所计算的计算时间,其值存储在double
中,返回类型为difftime()
。
我刚发现计算出的时间值仅以秒为单位。我不希望用户输入100和10000的结果都打印0e0
秒的计算持续时间。我希望它们分别打印1.23e-6
和4.56e-3
秒的持续时间(与机器可以测量的一样准确 - 我更熟悉Java中提供的准确性以及科学测量的准确性所以这是个人偏好。)
我已经看到了其他问题的答案,但它们没有帮助,因为1)我不会是多线程(在我的工作环境中不是首选)。 2)我不能使用C ++ 11或更高版本。
如果给定所述约束条件,我如何获得比秒数更精确的持续时间值作为整数值?
编辑:平台&机器无关的解决方案首选,否则Windows会做,谢谢!
编辑2:我的笔记本电脑也没有连接到互联网,因此没有像Boost那样下载外部库(Boost是什么?)。我必须自己编码。
答案 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";
注意事项:
GetTickCount64
,但只能从Vista开始使用; 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();