c - طريقة - رسم اوتوكاد للمبتدئين



الوقت المنقضي لتشغيل برنامج C (4)

أود أن أعرف ما هي خطوط رمز C لإضافة إلى برنامج بحيث يخبرني الوقت الكلي الذي يأخذ البرنامج لتشغيل. أعتقد أنه يجب أن يكون هناك التهيئة المضادة بالقرب من بداية الرئيسية وواحدة بعد انتهاء المهمة الرئيسية. هو رأس clock.h ؟

شكرا جزيلا...

تحديث لدي آلة وين زب. هل هو مجرد إضافة clock() في البداية وآخر clock() في نهاية البرنامج؟ ثم أستطيع تقدير فارق التوقيت. نعم، أنت على حق انها time.h

وإليك شفرتي:

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <share.h>
#include <time.h>


void f(long double fb[], long double fA, long double fB);

int main() {

clock_t start, end;
start = clock();


const int ARRAY_SIZE = 11;

long double* z = (long double*) malloc(sizeof (long double) * ARRAY_SIZE);

int i;
long double A, B;

if (z == NULL) {
    printf("Out of memory\n");
    exit(-1);
}

A = 0.5;
B = 2;


for (i = 0; i < ARRAY_SIZE; i++) {
    z[i] = 0;
}

z[1] = 5;

f(z, A, B);

for (i = 0; i < ARRAY_SIZE; i++)
    printf("z is %.16Le\n", z[i]);



free(z);
z = NULL;

end = clock();
printf("Took %ld ticks\n", end-start);
printf("Took %f seconds\n", (double)(end-start)/CLOCKS_PER_SEC);



return 0;  
}  

void f(long double fb[], long double fA, long double fB) {
    fb[0] = fb[1]* fA;
    fb[1] = fb[1] - 1;
    return;
 }  

بعض الأخطاء مع MVS2008:

testim.c(16) : error C2143: syntax error : missing ';' before 'const'  
testim.c(18) :error C2143: syntax error : missing ';' before 'type'  
testim.c(20) :error C2143: syntax error : missing ';' before 'type'   
testim.c(21) :error C2143: syntax error : missing ';' before 'type'    
testim.c(23) :error C2065: 'z' : undeclared identifier   
testim.c(23) :warning C4047: '==' : 'int' differs in levels of indirection from 'void *'  
testim.c(28) : error C2065: 'A' : undeclared identifier
testim.c(28) : warning C4244: '=' : conversion from 'double' to 'int', possible loss of data   

ويذهب إلى 28 أخطاء. لاحظ أن ليس لدي أي أخطاء / تحذيرات دون رموز الساعة الخاصة بك.

آخر الأخبار: أنا للأسف لم تحصل على رد جيد هنا. ولكن بعد البحث على غوغل، تعمل الشفرة. ها هو:

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <time.h>


void f(long double fb[], long double fA);

int main() {

clock_t start = clock();


const int ARRAY_SIZE = 11;

long double* z = (long double*) malloc(sizeof (long double) * ARRAY_SIZE);

int i;
long double A;

if (z == NULL) {
printf("Out of memory\n");
exit(-1);
}

A = 0.5;


for (i = 0; i < ARRAY_SIZE; i++) {
z[i] = 0;
}

z[1] = 5;

f(z, A);

for (i = 0; i < ARRAY_SIZE; i++)
printf("z is %.16Le\n", z[i]);



free(z);
z = NULL;

printf("Took %f seconds\n", ((double)clock()-start)/CLOCKS_PER_SEC);



return 0;
}

void f(long double fb[], long double fA) {
fb[0] = fb[1]* fA;
fb[1] = fb[1] - 1;
return;
}

في صحتك

تحديث في 10 أبريل: وهنا أفضل حل بفضل "جوستجيف"

#include <windows.h>
#include <stdio.h>
#include <stdlib.h>

void f(long double fb[], long double fA);

const int ARRAY_SIZE = 11;

int main(void)
{

   long double* z = (long double*) malloc(sizeof (long double) * ARRAY_SIZE);
   int i;
   long double A;

   LARGE_INTEGER freq;
   LARGE_INTEGER t0, tF, tDiff;
   double elapsedTime;
   double resolution;

   if (z == NULL) {
   printf("Out of memory\n");
   exit(-1);
   }
   QueryPerformanceFrequency(&freq);
   QueryPerformanceCounter(&t0);
   // code to be timed goes HERE
   {
    A = 0.5;


    for (i = 0; i < ARRAY_SIZE; i++) {
    z[i] = 0;
    }

    z[1] = 5;
    f(z, A);


    for (i = 0; i < ARRAY_SIZE; i++)
    printf("z is %.16Le\n", z[i]);

    free(z);
    z = NULL;

   }
QueryPerformanceCounter(&tF);
tDiff.QuadPart = tF.QuadPart - t0.QuadPart;
elapsedTime = tDiff.QuadPart / (double) freq.QuadPart;
resolution = 1.0 / (double) freq.QuadPart;
printf("Your performance counter ticks %I64u times per second\n", freq.QuadPart);
printf("Resolution is %lf nanoseconds\n", resolution*1e9);
printf("Code under test took %lf sec\n", elapsedTime);
return 0;
}


void f(long double fb[], long double fA) {
fb[0] = fb[1]* fA;
fb[1] = fb[1] - 1;
return;
}

وهو يعمل على حد سواء مع MVS2008 ومع بورلاند C + + بيلديركس من عام 2003.

https://src-bin.com


Answer #1

إذا كنت بحاجة إلى المجموع لبرنامجك ثم في وحدة تحكم لينكس:

$ time myProgram

يمكنك أيضا استخدام time.h في التعليمات البرمجية.

#include <time.h>

int main(){
  time_t start, end;
  start = time(0);

  /* some working code */

  end = time(0);
  printf("%i seconds", end - start );
}

Answer #2

ربما كنت تريد time.h، وعلى clock() وظيفة.


Answer #3

يمكنك استخدام وظيفة clock() في <time.h> إذا كنت ترغب في اختبار كتلة من التعليمات البرمجية أو برنامج time على * نيكس، كما اقترح جواب آخر. على سبيل المثال

> time ./foo my args

لساعة، تحتاج إلى طرح الفرق بين اثنين من نقاط التفتيش. على سبيل المثال

#include <time.h>

void f() {
  clock_t start, end;

  start = clock();

  // some long code.

  end = clock();
  printf("Took %ld ticks\n", end-start);
  // or in (fractional) seconds.
  printf("Took %f seconds\n", (double)(end-start)/CLOCKS_PER_SEC);
}

تحديث

فيما يتعلق بالأخطاء الجديدة، لا يمكنك مزج التعليمات البرمجية والإعلانات في فك. يجب عدم استدعاء أي وظائف ثم الاستمرار في إعلان المتغيرات. تعلن كل ما تبذلونه من فارس في الجزء العلوي، أو تجميع مع وضع C ++.


Answer #4

إذا كنت على ويندوز وكنت تريد قياس الاشياء أسفل في الميكروثانية، تحقق كيريبرفورمانسكونتر () و كيريبرفورمانسفريكنسي (). على العديد من النظم هذه يمكن حل كامل على مدار الساعة فترات المعالج، ثلث نانو الاشياء الثانية، وأنا لا أعتقد أنني رأيت من أي وقت مضى أي أكثر الخشنة من 3.5795MHz، لا يزال جيدا تحت ميكروثانية.

يمكنك استدعاء كيريبرفورمانسفريكنسي () لتحديد عدد التهم في الثانية العد التهم. ثم استدعاء كيريبرفورمانسكونتر () قبل التعليمات البرمجية تحت الاختبار، ثم مرة أخرى بعد. دلتا قراءات اثنين من كك وتقسيم الفترة من كف وتحصل على الوقت المنقضي بين المكالمات كك اثنين. مثل ذلك ...

LARGE_INTEGER freq;
LARGE_INTEGER t0, tF, tDiff;
double elapsedTime;
QueryPerformanceFrequency(&freq);
QueryPerformanceCounter(&t0);
// code to be timed goes HERE
QueryPerformanceCounter(&tF);
tDiff.QuadPart = tF.QuadPart - t0.QuadPart;
elapsedTime = tDiff.QuadPart / (double) freq.QuadPart;
// elapsedTime now has your measurement, w/resolution given by freq

ومن الواضح أن هذه الوصول جهاز العد الأجهزة التي ترتبط ببعض مذبذب النظام على اللوحة الرئيسية، وفي هذه الحالة أنها لا ينبغي أن تعاني غضب من تحميل البرمجيات. يعتمد القرار الذي تحصل عليه على النظام الخاص بك.

متابعة

وهنا برنامج كامل بسيط جدا يوضح واجهة:

#include <windows.h>
int main(void)
{
    LARGE_INTEGER freq;
    LARGE_INTEGER t0, tF, tDiff;
    double elapsedTime;
    double resolution;
    QueryPerformanceFrequency(&freq);
    QueryPerformanceCounter(&t0);
    // code to be timed goes HERE
    {
        Sleep(10);
    }
    QueryPerformanceCounter(&tF);
    tDiff.QuadPart = tF.QuadPart - t0.QuadPart;
    elapsedTime = tDiff.QuadPart / (double) freq.QuadPart;
    resolution = 1.0 / (double) freq.QuadPart;
    printf("Your performance counter ticks %I64u times per second\n", freq.QuadPart);
    printf("Resolution is %lf nanoseconds\n", resolution*1e9);
    printf("Code under test took %lf sec\n", elapsedTime);
    return 0;
}

لشيء بسيط مثل هذا، انها أسرع لتخطي إيد، فقط حفظه في ملف foo.c و (على افتراض مس فس 2008) استخدام سطر الأوامر

cl foo.c

لبناء ذلك. وإليك الإخراج على النظام الخاص بي:

Your performance counter ticks 3579545 times per second
Resolution is 279.365115 nanoseconds
Code under test took 0.012519 sec




elapsed