вычисление времени выполнения в c ++
-
22-08-2019 - |
Вопрос
Я написал программу на 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 секунд !!как это сделать ?да , извините , я имел в виду время исполнения !!
Решение
Если у вас установлен cygwin, из его оболочки bash запустите исполняемый файл, скажем 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;
}
Другие советы
В 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;
Для получения дополнительной информации нажмите здесь
Обзор
Я написал простой семантический хак для этого, используя @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
Примечание:первоначально вопрос был о времени компиляции, но позже выяснилось, что OP действительно означал время выполнения.Но, возможно, этот ответ все еще будет кому-то полезен.
Для Visual Studio:перейти к Tools / Options / Projects and Solutions / VC++ Project Settings
и установить Build Timing
возможность 'yes
'.После этого время каждой сборки будет отображаться в окне вывода.
Это похоже на алгоритм Дейстры.В любом случае, время, затраченное на запуск, будет зависеть от N.Если это займет более 3 секунд, я не вижу никакого способа ускорить это, поскольку необходимо выполнить все вычисления, которые он выполняет.
В зависимости от того, какую проблему вы пытаетесь решить, может существовать более быстрый алгоритм.
Я использовал технику, описанную выше, тем не менее я обнаружил, что время, указанное в Код: Блокирует IDE был более или менее похож на полученный результат-(возможно, он будет отличаться всего на несколько микросекунд)..