代码之家  ›  专栏  ›  技术社区  ›  Brian T Hannan

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

  •  2
  • Brian T Hannan  · 技术社区  · 15 年前

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

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

    已编辑:仅适用于Windows平台

    8 回复  |  直到 15 年前
        1
  •  1
  •   wheaties    15 年前

    你可以把这个

    #if _DEBUG
    time_t start = time(NULL);
    #endif
    

    然后结束这个

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

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

        2
  •  5
  •   ezod    15 年前

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

    编辑:很显然,Windows系统在 Windows Server 2003 Resource Kit timeit.exe (未经核实)。

        3
  •  2
  •   Dima    15 年前

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

        4
  •  1
  •   Martin Beckett    15 年前


    使用time命令运行程序以获取总时间-程序没有任何更改

        5
  •  1
  •   John Dibling    15 年前

    如果您使用的是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;
    }
    
        6
  •  0
  •   Diomidis Spinellis    15 年前

    Cygwin 指挥部。完成后,请花一些时间学习Cygwin附带的其他Unix工具。这将是你职业生涯中最好的投资之一;Unix工具箱是一个永恒的经典。

        7
  •  0
  •   sack    15 年前

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

    你需要一个“timeBeginPeriod(1)”之前和之后的“timeEndPeriod(1)”来尽可能降低粒度,但我发现它可以很好地用于我的目的(调节游戏中的时间步长),所以它应该可以用于基准测试。

        8
  •  0
  •   oosterwal    14 年前

    您也可以使用该程序 很困 获取有关程序的大量运行时信息。这里有一个链接: http://www.codersnotes.com/sleepy