Windows:如何计算运行c / c ++应用程序所需的时间?

时间:2010-01-20 22:14:57

标签: c++ c windows testing runtime

我正在进行性能对比测试。我想记录我的c ++测试应用程序的运行时间,并在不同情况下进行比较。要比较的两种情况是:1)文件系统驱动程序已安装并处于活动状态; 2)当未安装和激活相同的文件系统驱动程序时。

将在多个操作系统上进行一系列测试,并且将针对每个操作系统进行上述两次运行并进行设置。只有在给定操作系统和设置的两种情况下才会比较结果。

据我所知,在非实时系统的操作系统中运行c / c ++应用程序时,无法获得应用程序运行所需的实时时间。只要测试应用程序运行相当长的一段时间,我认为这不是一个大问题,因此使CPU的调度,优先级,切换等可以忽略不计。

已编辑:仅适用于Windows平台 如何在我的测试应用程序中生成一些准确的应用程序运行时结果?

8 个答案:

答案 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