45

私は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秒以内にしたいと思っています。どうやってするの ?ええごめんなさい私は実行時間を意味しました!!

4

8 に答える 8

127

cygwinがインストールされている場合は、bashシェルから、次のようにユーティリティMyProgramを使用して実行可能ファイルを実行します。time

/usr/bin/time ./MyProgram

これにより、プログラムの実行にかかった時間が報告されます。出力は次のようになります。

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

clock()次のように、ライブラリ関数を使用してCプログラムを手動で変更してインストルメント化することもできます。

#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;
}
于 2009-05-18T09:56:36.453 に答える
44

コードの実行時間を測定するための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;

詳細については、ここをクリックしてください

于 2017-12-19T13:27:00.427 に答える
18

概要

@AshutoshMehra応答を使用して、このための簡単なセマンティックハックを作成しました。あなたのコードはこのように本当に読みやすいように見えます!

大きい

#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
于 2014-01-24T07:46:15.193 に答える
10

注:質問は元々コンパイル時間に関するものでしたが、後でOPが実際には実行時間を意味することが判明しました。しかし、多分この答えはまだ誰かのために役立つでしょう。

Visual Studioの場合:に移動し、オプションを' 'Tools / Options / Projects and Solutions / VC++ Project Settingsに設定します。その後、すべてのビルドの時間が出力ウィンドウに表示されます。Build Timingyes

于 2009-05-18T09:56:44.940 に答える
3

これはDijstraのアルゴリズムのように見えます。いずれにせよ、実行にかかる時間はNによって異なります。3秒以上かかる場合は、実行しているすべての計算を実行する必要があるため、速度を上げる方法はありません。

解決しようとしている問題によっては、より高速なアルゴリズムが存在する場合があります。

于 2009-05-18T13:01:28.670 に答える
0

上記の手法を使用しましたが、Code:Blocks IDEで指定された時間は、得られた結果とほぼ同じであることがわかりました(マイクロ秒単位で異なる場合があります)。

于 2013-04-08T04:07:42.817 に答える
0

C ++を使用している場合は、@ Ashutosh Mehraの回答を直接使用すると、回答として常に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桁に設定しました。

于 2021-06-26T16:52:59.247 に答える
0

以下の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;
于 2021-08-30T10:40:53.660 に答える