我正在进行性能对比测试。我想记录我的c ++测试应用程序的运行时间,并在不同情况下进行比较。要比较的两种情况是:1)文件系统驱动程序已安装并处于活动状态; 2)当未安装和激活相同的文件系统驱动程序时。
将在多个操作系统上进行一系列测试,并且将针对每个操作系统进行上述两次运行并进行设置。只有在给定操作系统和设置的两种情况下才会比较结果。
据我所知,在非实时系统的操作系统中运行c / c ++应用程序时,无法获得应用程序运行所需的实时时间。只要测试应用程序运行相当长的一段时间,我认为这不是一个大问题,因此使CPU的调度,优先级,切换等可以忽略不计。
已编辑:仅适用于Windows平台 如何在我的测试应用程序中生成一些准确的应用程序运行时结果?
答案 0 :(得分:5)
如果你在POSIX系统上,你可以使用time
命令,它将为你提供总的“挂钟”时间以及实际的CPU时间(用户和系统)。
编辑:显然Windows Server 2003 Resource Kit timeit.exe
中有一个名为{{1}}的Windows系统(未经验证)。
答案 1 :(得分:2)
我认为您所问的是“我如何衡量流程运行所需的时间,而不考虑”外部“因素,例如系统上运行的其他程序?在这种情况下,最简单的方法是多次运行程序,并获得平均时间。通过这种方式,您可以进行更有意义的比较,希望操作系统花费CPU时间的各种随机事物将平均化。如果你想获得真正的幻想,你可以使用统计测试,例如双样本t检验,看看平均时间的差异是否真的很重要。
答案 2 :(得分:1)
只是为了扩展ezod的答案 使用time命令运行程序以获得总时间 - 程序没有更改
答案 3 :(得分:1)
你可以把这个
#if _DEBUG
time_t start = time(NULL);
#endif
并以此结束
#if _DEBUG
time end = time(NULL);
#endif
在您的int main()
方法中。当然,您必须将差异返回到日志或cout
。
答案 4 :(得分:1)
如果您使用的是Windows系统,则可以通过拨打QueryPerformanceCounter()来使用高性能计数器:
#include <windows.h>
#include <string>
#include <iostream>
int main()
{
LARGE_INTEGER li = {0}, li2 = {0};
QueryPerformanceFrequency(&li);
__int64 freq = li.QuadPart;
QueryPerformanceCounter(&li);
// run your app here...
QueryPerformanceCounter(&li2);
__int64 ticks = li2.QuadPart-li.QuadPart;
cout << "Reference Implementation Ran In " << ticks << " ticks" << " (" << format_elapsed((double)ticks/(double)freq) << ")" << endl;
return 0;
}
...就像奖励一样,这是一个将经过时间(以秒为单位,浮点数)转换为描述性字符串的函数:
std::string format_elapsed(double d)
{
char buf[256] = {0};
if( d < 0.00000001 )
{
// show in ps with 4 digits
sprintf(buf, "%0.4f ps", d * 1000000000000.0);
}
else if( d < 0.00001 )
{
// show in ns
sprintf(buf, "%0.0f ns", d * 1000000000.0);
}
else if( d < 0.001 )
{
// show in us
sprintf(buf, "%0.0f us", d * 1000000.0);
}
else if( d < 0.1 )
{
// show in ms
sprintf(buf, "%0.0f ms", d * 1000.0);
}
else if( d <= 60.0 )
{
// show in seconds
sprintf(buf, "%0.2f s", d);
}
else if( d < 3600.0 )
{
// show in min:sec
sprintf(buf, "%01.0f:%02.2f", floor(d/60.0), fmod(d,60.0));
}
// show in h:min:sec
else
sprintf(buf, "%01.0f:%02.0f:%02.2f", floor(d/3600.0), floor(fmod(d,3600.0)/60.0), fmod(d,60.0));
return buf;
}
答案 5 :(得分:0)
下载Cygwin并通过将其作为参数传递给 time 命令来运行程序。完成后,花些时间学习Cygwin附带的其他Unix工具。这将是您有史以来最好的投资之一; Unix工具箱是一个永恒的经典。
答案 6 :(得分:0)
QueryPerformanceCounter在多核系统上可能有问题,所以我更喜欢使用timeGetTime(),它以毫秒为单位给出结果
之前你需要一个'timeBeginPeriod(1)'和'timeEndPeriod(1)'以尽可能地减少粒度,但我觉得它很适合我的目的(调整游戏中的时间步长),所以它应该是可以进行基准测试。
答案 7 :(得分:0)
您还可以使用 very sleepy 程序获取有关程序的大量运行时信息。这是一个链接:http://www.codersnotes.com/sleepy