Подтвердить что ты не робот

Вычисление времени выполнения в С++

Я написал программу на С++, я хочу знать, как вычислить время, затраченное на выполнение, поэтому я не буду превышать лимит времени.

#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-х секунд! как это сделать? да, жаль, что я имел в виду время выполнения!

4b9b3361

Ответ 1

Если у вас установлен cygwin, из него bash shell запустите исполняемый файл, скажем MyProgram, используя утилиту time, например:

/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;
}

Ответ 2

Обзор

Я написал простой семантический взлом для этого, используя ответ @AshutoshMehra. Вы код выглядит действительно читаемым таким образом!

MACRO

#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
}

OUTPUT

Block Speed: 0.127000000s

Ответ 3

Примечание: вопрос был первоначально о времени компиляции, но позже выяснилось, что OP действительно означает время выполнения. Но, возможно, этот ответ по-прежнему будет полезен для кого-то.

Для Visual Studio: перейдите к Tools / Options / Projects and Solutions / VC++ Project Settings и установите для параметра Build Timing значение "yes". После этого время каждого построения будет отображаться в окне "Вывод".

Ответ 4

Это выглядит как алгоритм Дийстра. В любом случае время, затрачиваемое на запуск, будет зависеть от N. Если это займет более 3 секунд, я не вижу возможности ускорить его, так как все расчеты, которые он выполняет, должны быть выполнены.

В зависимости от того, какую проблему вы пытаетесь решить, может быть более быстрый алгоритм.

Ответ 5

Все время выполнения отображается как 0 или 0.001. Это может быть правильным, но возможно ли, чтобы он составлял 0 секунд?

Ответ 6

Я использовал описанную выше технику, но я обнаружил, что время, указанное в Code: Blocks IDE, было более или менее сходным с полученным результатом (может быть, оно будет мало отличаться от микро секунд)..

Ответ 7

С С++ 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;

Для получения дополнительной информации нажмите здесь