C++ 时间和基准

C++ 时间和基准,c++,windows,algorithm,benchmarking,C++,Windows,Algorithm,Benchmarking,如果我想比较两种算法的速度,最好的方法是什么? 我熟悉数学的方法,我知道我还没有完全掌握它=/ 我想知道如何在Windows上精确地计算两个算法的时间。 最好使用的API是什么?stdio.h中的time()可靠吗?还是我需要更好的API 举个例子也不错! 谢谢大家! 你要找的是和。这些是访问高分辨率计时器的Windows API函数。它们应该比time或GetSystemTime产生更好的精度 LARGE_INTEGER time1; QueryPerformanceCounter(&

如果我想比较两种算法的速度,最好的方法是什么? 我熟悉数学的方法,我知道我还没有完全掌握它=/ 我想知道如何在Windows上精确地计算两个算法的时间。 最好使用的API是什么?stdio.h中的time()可靠吗?还是我需要更好的API

举个例子也不错!
谢谢大家!

你要找的是和。这些是访问高分辨率计时器的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;

我发现了一个可以用作示例的
CStopWatch
类的实现。这些是访问高分辨率计时器的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;

我发现了一个可以用作示例的
CStopWatch
类的实现。

QueryPerformanceCounter/QueryPerformanceFrequency。好了,它们现在是固定的,实际上是测量周期的。请记住提高线程的优先级,以便在测量时,它对其他线程的影响较小

如果可测量代码的运行时间较低,抢占可能会导致相当多的错误


因此,提高优先级并多次重新运行测试。

QueryPerformanceCounter/QueryPerformanceFrequency。好了,它们现在是固定的,实际上是测量周期的。请记住提高线程的优先级,以便在测量时,它对其他线程的影响较小

如果可测量代码的运行时间较低,抢占可能会导致相当多的错误


因此,提高优先级并多次重新运行测试。

不幸的是,这不是一项容易的任务

如前所述,QueryPerformanceCounter是一个可行的选择。
其他可能性包括:
-GetTickCount(不建议使用,因为它的精度低于30ms)
-timeGetTime:默认情况下,它的精度为15毫秒。这对应于任务计划程序分配的默认时间(在我的计算机上为15毫秒)。您可以通过更改一个系统范围的设置来强制timeGetTime更加准确,该设置控制调度程序分配的时间:调用timeBeginPeriod可以做到这一点。但是,这只能用作临时系统攻击!请不要在发布代码中使用它
-查询处理器的时间戳计数器:这需要汇编程序编程,我不建议这样做

就QueryPerformanceCounter而言,您可以在此处找到一个易于使用的包装器:

您可以这样使用它:

CPerfTimer t;
t.Start();     
CallExpensiveTask();
std::cout << "Time (ms) " << t.Elapsedms();

不幸的是,这不是一项如此容易的任务

如前所述,QueryPerformanceCounter是一个可行的选择。
其他可能性包括:
-GetTickCount(不建议使用,因为它的精度低于30ms)
-timeGetTime:默认情况下,它的精度为15毫秒。这对应于任务计划程序分配的默认时间(在我的计算机上为15毫秒)。您可以通过更改一个系统范围的设置来强制timeGetTime更加准确,该设置控制调度程序分配的时间:调用timeBeginPeriod可以做到这一点。但是,这只能用作临时系统攻击!请不要在发布代码中使用它
-查询处理器的时间戳计数器:这需要汇编程序编程,我不建议这样做

就QueryPerformanceCounter而言,您可以在此处找到一个易于使用的包装器:

您可以这样使用它:

CPerfTimer t;
t.Start();     
CallExpensiveTask();
std::cout << "Time (ms) " << t.Elapsedms();

您确定QueryPerformanceCounter已修复吗?你是在说第号中描述的问题吗?我想的是硬件缺陷,它使多核机器上的性能计数器发生了很大的变化。speedstep仍然会影响计数器,因此,如果应用程序可以在此类环境中运行,则需要带有GetTickCount的watchdog来检测核心减速/加速。但对于大多数基准测试任务,QPC已经足够好了。Speedstep不会影响QPC。这正是为什么它比
RDTSC
更受欢迎的原因。唯一可能破坏QPC的是。。。有缺陷的硬件/驱动程序/bios。但是Speedstep和其他类似的技巧并不影响它。(并且它没有专门测量时钟周期)您确定QueryPerformanceCounter已修复吗?你是在说第号中描述的问题吗?我想的是硬件缺陷,它使多核机器上的性能计数器发生了很大的变化。speedstep仍然会影响计数器,因此,如果应用程序可以在此类环境中运行,则需要带有GetTickCount的watchdog来检测核心减速/加速。但对于大多数基准测试任务,QPC已经足够好了。Speedstep不会影响QPC。这正是为什么它比
RDTSC
更受欢迎的原因。唯一可能破坏QPC的是。。。有缺陷的硬件/驱动程序/bios。但是Speedstep和其他类似的技巧并不影响它。(并没有具体测量时钟周期)这个答案更有趣。当您谈到查询处理器的时间戳计数器时,它的准确性如何?因为我不介意使用汇编代码,所以我对此很满意。你确定15毫秒量子吗?这是很多时间,我认为它比那更早进行了上下文切换:)@toto这比只说15毫秒要复杂得多。注意一个线程可能会得到3-9个量程,其中3个量程在10到15毫秒之间。解决QueryPerformanceCounter问题就像为测试应用程序设置处理器相关性一样简单。@toto:你确定需要这样的精度吗?只需在循环中运行您的算法,使总执行时间大约为一分钟,然后与另一个算法运行相同的次数进行比较。这应该会让你知道差别有多大。确保背景中没有沉重的奔跑,