سؤال

لقد قمت بكتابة برنامج 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 ثواني !!كيف افعلها ؟نعم آسف أقصد وقت التنفيذ !!

هل كانت مفيدة؟

المحلول

إذا كنت قد قمت بتثبيت سيغوين، من انها باش قذيفة، قم بتشغيل الملف التنفيذي الخاص بك، ويقول 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 لقياس وقت تنفيذ مجموعة من التعليمات البرمجية، يمكننا استخدام وظيفة الآن ():

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_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. بعد ذلك سيتم عرض الوقت من كل بناء في إطار الإخراج.

وهذا يبدو وكأنه خوارزمية Dijstra ل. في أي حال، فإن الوقت الذي يستغرقه لتشغيل يعتمد على N. إذا كان يحتاج إلى أكثر من 3 ثوان ليس هناك أي طريقة أستطيع أن أرى من مسرعة عنه، وجميع الحسابات التي تقوم به تحتاج إلى القيام به.

واعتمادا على ما المشكلة التي نحاول حلها، قد يكون هناك خوارزمية أسرع.

لقد استخدمت التقنية المذكورة أعلاه، ومع ذلك وجدت أن الوقت المحدد في الكود: كتل IDE كانت مشابهة إلى حد ما للنتيجة التي تم الحصول عليها - (قد تختلف بمقدار ميكرو ثانية صغيرة)..

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top