如果我想比较两种算法的速度,最好的方法是什么? 我熟悉数学方法,我知道我还没有完全掌握它= / 我很想知道如何在Windows上以高精度计算两种算法。 什么是最好的API,stdio.h中的time()是可靠的还是我需要更好的东西?
一个例子也会很好! 谢谢!
答案 0 :(得分:2)
您要找的是QueryPerformanceCounter
和QueryPerformanceFrequency
。这些是用于访问高分辨率计时器的Windows API函数。它们应该比time
或GetSystemTime
产生更好的精确度。
LARGE_INTEGER time1;
QueryPerformanceCounter(&time1);
// Your code
LARGE_INTEGER time2;
QueryPerformanceCounter(&time2);
LARGE_INTEGER ticksPerSecond;
QueryPerformanceFrequency(&ticksPerSecond);
double seconds = (double)(time2.QuadPart - time1.QuadPart) / ticksPerSecond.QuadPart;
here我找到了一个CStopWatch
类的实现,可以作为一个例子。
答案 1 :(得分:2)
不幸的是,这不是一件容易的事。
如前所述,QueryPerformanceCounter是一个可行的选择
其他可能性是:
- GetTickCount (不建议,因为其准确性低于30毫秒)
- timeGetTime :默认情况下,精度为15ms。这对应于任务调度程序分配的默认时间(在我的计算机上为15ms)。您可以通过更改规则调度程序分配的时间的系统范围设置来强制timeGetTime更准确:调用timeBeginPeriod可以执行此操作。但是,这应该仅用作临时系统黑客!请不要在发布代码中使用它!
- 查询处理器的时间戳计数器:这需要汇编程序编程,我不推荐它。
就QueryPerformanceCounter而言,您可以在此处找到一个易于使用的包装器:http://www.codeproject.com/KB/datetime/perftimer.aspx
你可以这样使用它:
CPerfTimer t;
t.Start();
CallExpensiveTask();
std::cout << "Time (ms) " << t.Elapsedms();
但是有一些建议:
有关处理器时间戳计数器的更多说明
#pragma warning (disable : 4035) // disable no return value warning
__forceinline DWORD GetPentiumCounter()
{
__asm
{
xor eax,eax // VC won't realize that eax is modified w/out this
// instruction to modify the val.
// Problem shows up in release mode builds
_emit 0x0F // Pentium high-freq counter to edx;eax
_emit 0x31 // only care about low 32 bits in eax
xor edx,edx // so VC gets that edx is modified
}
}
#pragma warning (pop)
答案 2 :(得分:0)
QueryPerformanceCounter的/ QueryPerformanceFrequency的。 AFAIK,现在已修复,实际上是测量周期。只需记住提高线程的优先级,以便在测量时它对其他线程的影响较小。
如果可测量代码的运行时间很短,则抢占可能会导致相当多的错误。
因此提升优先级并多次重新运行测试。