سؤال

ج clock() الوظيفة فقط تعيد لي صفر. حاولت استخدام أنواع مختلفة ، دون أي تحسن ... هل هذه طريقة جيدة لقياس الوقت بدقة جيدة؟

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

int main()
{
    clock_t start, end;
    double cpu_time_used;

    char s[32];

    start = clock();

    printf("\nSleeping 3 seconds...\n\n");
    sleep(3);

    end = clock();

    cpu_time_used = ((double)(end - start)) / ((double)CLOCKS_PER_SEC);

    printf("start = %.20f\nend   = %.20f\n", start, end);
    printf("delta = %.20f\n", ((double) (end - start)));
    printf("cpu_time_used  = %.15f\n", cpu_time_used);
    printf("CLOCKS_PER_SEC = %i\n\n", CLOCKS_PER_SEC);

    return 0;
}
Sleeping 3 seconds...

start = 0.00000000000000000000
end   = 0.00000000000000000000
delta = 0.00000000000000000000
cpu_time_used  = 0.000000000000000
CLOCKS_PER_SEC = 1000000

المنصة: Intel 32 Bit ، Redhat Linux ، GCC 3.4.6

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

المحلول

clock() تقارير وقت وحدة المعالجة المركزية المستخدمة. sleep() لا تستخدم أي وقت وحدة المعالجة المركزية. لذلك ربما تكون نتيجتك صحيحة تمامًا ، وليس فقط ما تريد.

نصائح أخرى

man clock. إنه لا يعيد ما تعتقد أنه. ايضا man gettimeofday - من المرجح ما تريده.

clock_t هو نوع عدد صحيح. لا يمكنك طباعته مع ٪ f. يرى إجابة فريد لماذا الفرق هو 0.

 printf("start = %.20f\nend   = %.20f\n", start, end);

يجب ان يكون:

 printf("start = %d\nend   = %d\n", start, end);

الدعوة sleep() لن تستخدم أي وقت وحدة المعالجة المركزية. يجب أن ترى أ القليل الفرق ، رغم ذلك. لقد قمت بتصحيح خطأ عدم تطابق نوع printf في هذا السطر:

printf("start = %.20f\nend   = %.20f\n", start, end);

وقد أعطت نتائج معقولة على جهازي:

start = 1419
end   = 1485
delta = 66
cpu_time_used  = 0.000066000000000
CLOCKS_PER_SEC = 1000000

قد تحاول gettimeofday() للحصول على الوقت الحقيقي الذي يقضيه في تشغيل البرنامج.

ربما تحتاج

double get_wall_time(){ struct timeval time; if (gettimeofday(&time,NULL)){ return 0; } return (double)time.tv_sec + (double)time.tv_usec * .000001; } واستخدام شيء مثل

double wall0 = get_wall_time(); double cpu0 = get_cpu_time(); for(long int i = 0; i<=10000000;i++){ func1(); } double wall1 = get_wall_time(); double cpu1 = get_cpu_time(); cout << "Wall Time = " << wall1 - wall0 << endl; cout << "CPU Time = " << cpu1 - cpu0 << endl;

بدلاً من clock()

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

مثل time ./a.out

إخراج أمر الوقت:

real 0m5.987s user 0m0.674s sys 0m0.134s

وإخراج الوظيفة المخصصةWall Time = 5.98505 CPU Time = 0.8

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