在C++中计算执行时间

54

我编写了一个C++程序,想知道如何计算执行时间,以便不超过时间限制。

#include<iostream>

using namespace std;

int main ()
{
    int st[10000],d[10000],p[10000],n,k,km,r,t,ym[10000];
    k=0;
    km=0;
    r=0;
    scanf("%d",&t);
    for(int y=0;y<t;y++)
    {
    scanf("%d",&n);
    for(int i=0;i<n;i++)
    {
            cin>>st[i] >>d[i] >>p[i];
    }
    for(int i=0;i<n;i++)
    {
            for(int j=i+1;j<n;j++)
            {
                    if((d[i]+st[i])<=st[j])
                    {
                              k=p[i]+p[j];
                    }
                    if(k>km)
                    km=k;
            }
        if(km>r)
        r=km;
    }
    ym[y]=r;
}
    for( int i=0;i<t;i++)
    {
         cout<<ym[i]<<endl;
    }


    //system("pause");
    return 0;
}     

这是我的程序,我希望它在3秒内完成!如何做到呢? 对不起,我想说的是执行时间!


1
什么时间限制?只有你可以设定时间限制,而我想不出有什么好的理由这样做。 - duffymo
这主要取决于编译器/服务器/磁盘/其他负载。通常情况下,你不需要设置这样的限制。 - Drakosha
2
你确定需要测量编译时间吗?也许你是指执行时间? - Alex Jenter
7
你应该始终修复问题中所有错误的部分。不要只是在结尾添加一点编辑。修复标题,修复所有其他地方说“compilation”的地方。 - S.Lott
9个回答

132
如果您已经安装了Cygwin,在其Bash shell中使用time实用工具运行可执行文件,例如MyProgram,方法如下:
/usr/bin/time ./MyProgram

这将报告程序执行花费的时间 -- 输出结果看起来应该像下面这样:

real    0m0.792s
user    0m0.046s
sys     0m0.218s

您还可以手动修改C程序,使用clock()库函数对其进行插装,如下所示:

#include <time.h>
int main(void) {
    clock_t tStart = clock();
    /* Do your stuff here */
    printf("Time taken: %.2fs\n", (double)(clock() - tStart)/CLOCKS_PER_SEC);
    return 0;
}

16
请注意,clock() 获得的是总执行时间。因此,如果您在多线程代码中使用它,可能会得到比您预期更大的结果。 - FreeNickname
谢谢FreeNickname,我在想为什么当我增加线程时,程序运行得更慢了! - Frederik
@Ashutosh Mehra,使用您的时钟代码始终输出为零,该怎么办? - uss

52

使用C++11来测量一段代码的执行时间,我们可以使用now()函数:

auto start = chrono::steady_clock::now();

//  Insert the code that will be timed

auto end = chrono::steady_clock::now();

// Store the time difference between start and end
auto diff = end - start;

如果您想要在上述代码中打印开始时间和结束时间之间的时间差,您可以使用:

cout << chrono::duration <double, milli> (diff).count() << " ms" << endl;

如果您更喜欢使用纳秒,您可以使用:

cout << chrono::duration <double, nano> (diff).count() << " ns" << endl;

diff变量的值也可以被截断为整数值。例如,如果你想要结果表示为:

diff_sec = chrono::duration_cast<chrono::nanoseconds>(diff);
cout << diff_sec.count() << endl;

点击这里了解更多信息。


1
请从现在开始,在回答有关STL的问题时使用std::前缀。 - Silidrone

20

概述

我使用@AshutoshMehra的响应写了一个简单的语义化hack。这样你的代码看起来非常易读!

#include <time.h>

#ifndef SYSOUT_F
#define SYSOUT_F(f, ...)      _RPT1( 0, f, __VA_ARGS__ ) // For Visual studio
#endif

#ifndef speedtest__             
#define speedtest__(data)   for (long blockTime = NULL; (blockTime == NULL ? (blockTime = clock()) != NULL : false); SYSOUT_F(data "%.9fs", (double) (clock() - blockTime) / CLOCKS_PER_SEC))
#endif

使用方法

speedtest__("Block Speed: ")
{
    // The code goes here
}

输出

Block Speed: 0.127000000s

10
注意:原问题是关于编译时间的,但后来发现OP实际上指的是执行时间。但也许这个答案仍然对某些人有用。
对于Visual Studio:转到 工具 / 选项 / 项目和解决方案 / VC++项目设置,并将 构建计时 选项设置为 ''。之后每次构建的时间将显示在输出窗口中。

6
您可以尝试以下C++代码:
#include <chrono>


auto start = std::chrono::system_clock::now();
// Your Code to Execute //
auto end = std::chrono::system_clock::now();
std::cout << std::chrono::duration_cast<std::chrono::milliseconds>(end - start).count() << "ms" << std::endl;

3
这看起来像是Dijstra算法。无论如何,运行所需的时间将取决于N。如果它需要超过3秒钟,我没有看到任何加速它的方法,因为它所做的所有计算都需要完成。
根据您要解决的问题,可能有更快的算法。

0
如果您正在使用C ++,则应尝试以下代码,因为如果直接使用@Ashutosh Mehra's answer,您将始终得到0作为答案。
#include <iostream>
#include <time.h>

using namespace std;

int main() {
    int a = 20000, sum=0;
    
    clock_t start = clock();
    for (int i=0; i<a; i++) {
        for (int k = 0; k<a; k++)
            sum += 1;
    }
    cout.precision(10);
    cout << fixed <<  float(clock() - start)/CLOCKS_PER_SEC  << endl;
    return 0;
}

因为在C++中,float和double类型的值会直接四舍五入。因此我使用cout.precision(10)将输出精度设置为小数点后10位。

(请注意,一个半好的编译器必须被防止为嵌套循环生成任何代码 - 这可能是 sree提到的问题 的一个可能解释。这可以通过在 << endl 之前使用 << " for " << sum 来阻止。对于静态评估还不确定...) - greybeard

0

Ashutosh Mehra的回答的简短版本:

/* including stuff here */
#include <time.h>
int main(void) {
    clock_t tStart = clock();
    /* stuff here */
    cout<<"Time taken: "<<(double)(clock() - tStart)/CLOCKS_PER_SEC;
    return 0;
}

0

我已经使用了上述技术,但是我发现在Code:Blocks IDE中给出的时间与得到的结果几乎相似(可能会有微秒级别的差异)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接