C++ Windows:如何计算c/c++;要运行的应用程序?

C++ Windows:如何计算c/c++;要运行的应用程序?,c++,c,windows,testing,runtime,C++,C,Windows,Testing,Runtime,我正在做一个性能比较测试。我想记录我的C++测试应用程序的运行时间,并在不同的情况下比较它。要比较的两种情况是:1)文件系统驱动程序已安装并处于活动状态;2)同一文件系统驱动程序未安装并处于活动状态 将在多个操作系统上进行一系列测试,并对每个操作系统及其设置进行上述两次运行。结果将仅在给定操作系统和设置的两种情况下进行比较 我知道,在非实时系统的操作系统中运行c/c++应用程序时,无法获得应用程序运行所需的实时时间。我不认为这是一个大问题,只要测试应用程序运行相当长的一段时间,因此可以忽略CPU

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

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


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

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

如果您在POSIX系统上,您可以使用
time
命令,该命令将为您提供总的“挂钟”时间以及实际的CPU时间(用户和系统)


编辑:显然,在名为
timeit.exe(未经验证)的文件中,有一个与Windows系统等效的文件。

仅扩展ezod的答案。
您可以使用time命令运行程序以获取总时间-程序没有任何更改

#if _DEBUG
time_t start = time(NULL);
#endif
然后结束这个

#if _DEBUG
time end = time(NULL);
#endif

int main()
方法中。当然,您必须将差异返回到日志或
cout
中。

如果您使用的是Windows系统,您可以通过调用以下命令来使用高性能计数器:

#包括
#包括
#包括
int main()
{
大整数li={0},li2={0};
查询性能频率(&li);
__int64 freq=li.QuadPart;
QueryPerformanceCounter(&li);
//在此处运行你的应用程序。。。
QueryPerformanceCounter(&li2);
__int64 ticks=li2.QuadPart-li.QuadPart;

cout我想你要问的是“我如何衡量进程运行所需的时间,而不考虑‘外部’因素,例如系统上运行的其他程序?”在这种情况下,最简单的方法是多次运行程序,并获得平均时间。这样,您可以进行更有意义的比较,希望操作系统花费CPU时间处理的各种随机事件都能得到平均值。如果您想真正喜欢,您可以使用统计测试,例如两个样本的t-test,看看t平均计时的差异实际上非常显著。

下载并运行程序,将其作为参数传递给time命令。完成后,花一些时间学习Cygwin附带的其他Unix工具。这将是您职业生涯中最好的投资之一;Unix工具箱是一个timeless classic。

QueryPerformanceCounter在多核系统上可能会有问题,因此我更喜欢使用timeGetTime(),它以毫秒为单位给出结果


你需要一个“timeBeginPeriod(1)”之前和“timeEndPeriod(1)”之后,以尽可能减少粒度,但我发现它很适合我的目的(调节游戏中的时间步),所以进行基准测试应该没问题。

您也可以使用“非常困倦”程序来获取有关您的程序的大量运行时信息。这里有一个链接:

“无法获取应用程序运行所需的实时时间”这意味着什么?你无法获得的“实时”时间是什么?在我看来,经过的时间似乎是真实的。实时是指处理程序中的代码所花费的实际时间。非实时操作系统管理进程,并根据优先级等切换哪些进程将在何时运行。应用程序所花费的全部时间“要运行的时间通常大于应用程序实际处理的时间,因为操作系统在进程和应用程序之间的切换处于等待状态,在这里等待一会儿,在那里等待一会儿”。@Brian T Hannan:这是可能的(即使在非实时操作系统上也是如此)测量一个进程的挂钟时间和CPU时间。宠物皮:你想测量运行时间,而不是计算它,这会立即让我想起停止问题……宠物皮:那些声称对手头的某个主题无关的事情感到恼火的家伙。是的,timeit.exe是在Windows系统上执行此操作的最佳方法cygwin可能会给你unix“time”命令。我在Google上看到了这两个命令的实例,但我没有办法验证。回答很好,我接受了统计数据,这是个好主意,但我认为这可能有点过分。我不认为我需要高精度,而且在不同的系统上似乎有不同类型的输出。虽然这是一个好建议,但我认为布莱恩:也许不是,只是要知道GetTickCount()的粒度并不是看起来的那样。文档说它以毫秒为单位返回一个值,但他们没有说该值的粒度可能是几百毫秒。对于长时间运行的程序(即>1秒左右)这不是问题,但对于计时代码块GetTickCount()是毫无价值的。正确,我将对查找、打开和读取指定目录路径内所有文件中x个字符的任务进行计时。运行时间将为秒甚至分钟。这是一个好主意,但我必须在我设置的每个测试系统上安装Cygwin吗?我不想在te上安装任何东西st机器。您可以在U盘上复制cygwin的最小安装。安装大约需要多长时间?我将在将从重影图像中重影的机器上反复重复此测试。我将在各种Windows操作系统上运行测试,不需要
#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;
}