وظيفة C `()` `فقط تُرجع الصفر
سؤال
ج 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