PDA

View Full Version : سوال: مشکل در دقت کار تابع clock()



one hacker alone
سه شنبه 14 آذر 1391, 23:06 عصر
با یاد خدا
با سلام
من برای کد زیر زمان سنج گذاشتم اما این تابع اون دقتی که میخوام رو نداره و زمان رو صفر برمیگردونه
زمان شروع و پایان رو هم گرفتم اونا هم صفر بود با دقت اعشار هم گرفتم اما باز کلا صفر

#include <iostream>
#include <stdio.h>
#include <time.h>
using namespace std;
int main()
{
int a;
clock_t start,end;
double cpu_time_used;
start=clock();
for(long int i=0;i<=999;i++)
{
a=a+12/3+2;
a--;
}
end=clock();
cpu_time_used=((double) (end-start))/CLOCKS_PER_SEC;
cout<<endl<<cpu_time_used<<endl;

return 0;
}
من یه چیز خیلی دقیقی میخوام که بتونه تفاوت بین حلقه تکرار ۵ با ۱۰ بار رو تشخیص بده

#target
چهارشنبه 15 آذر 1391, 06:51 صبح
از تابع QueryPerformanceCounter استفاده کنید .

Ananas
چهارشنبه 15 آذر 1391, 09:04 صبح
سلام.
بر حسب ثانیه بخوایم به فرکانس هم تقسیم می کنیم :

double GetNow()
{
LARGE_INTEGER lic, lif;
QueryPerformanceCounter( &lic );
QueryPerformanceFrequency( &lif );
return ( (double)lic.QuadPart / (double)lif.QuadPart);
};

H_G_G_I
چهارشنبه 15 آذر 1391, 10:12 صبح
clock()
یا GetTickCount()
همشون بر حسب میلی ثانیه هستن . هزار تا حلق هم بزاری همش به 1 میلی ثانیه نمی رسه !
باید میکرو ثانیه و یا بیشتر بگیری !
من از QueryPerformanceCounter هم استفاده کردم اما نشد !
کسی می تونه یچی بده که دقیقا محسبه کنه !
من کل نت رو زیر رو کردم همش میلی ثانیه بود !
:گریه:
:گریه:
:گریه زیاد تر:
:گریه و جیغ:

one hacker alone
چهارشنبه 15 آذر 1391, 14:09 عصر
من این تابعی که گفتین رو تست نکردم اما دوستمون میگه جواب نمیده
دوستان راه حل چیه؟
در ضمن من در linux مینویسم

Ananas
چهارشنبه 15 آذر 1391, 14:34 عصر
من از QueryPerformanceCounter هم استفاده کردم اما نشد !
چه چیزی نشد؟ می خواستی چی بشه که نشد؟ البته نمیشه گفت زمان رو بر حسب ثانیه میده! دقت کنید که با این روش اختلاف زمانی دو لحظه رو می تونید حساب کنید. یعنی اگه دو بار تابع GetNow رو اجرا کنید و مقادیرشون رو از هم کم کنید فاصله ی زمانی دو فراخوانی رو بر حسب ثانیه بهتون میگه. کاری به عددی که میگه نداشته باشید چون اینطور که از اسمش بر میاد تعداد رو با شروع کار کامپیوتر شروع میکنه و همینطور زیادش میکنه و فرکانس هم که به هرتز سی پیوتون فرق میکنه. پس اگه می خواید ساعت رو در لحظه ای خاص بگیرید فکر میکنم روش خوبی نیست ولی اگه اختلاف زمانی رو می خواید (مثل تایمر برای انجام کاری) این روش دقت خیلی بالایی داره بسته به هرتز سی پیو می تونه از میلی ثانیه هم دقیق تر باشه.

در ضمن من در linux مینویسم
مثل اینکه این تابع در winbase.h تعریف شده پس احتمالا تو لینوکس این رو نداشته باشید.

H_G_G_I
چهارشنبه 15 آذر 1391, 14:51 عصر
نه درسته من با دقت اعشاری کم نشون می دادم معلوم نبود!
ممنون !
:قلب:

#target
چهارشنبه 15 آذر 1391, 15:33 عصر
در ضمن من در linux مینویسم

برای مستقل از پلتفرم در پردازشگر های x86 میتونین دستور RDTSC که به معنای read time stamp counter هست رو بصورت اسمبلی فراخوانی کنید .
نتیجه این دستور در رجیسترهای eax edx قرار خواهد گرفت .
دوبار فراخوانی کنین مقایسه کنین ببین میشه یا نه .

پ.ن .. فکر کنم مثل اون تابع در لینوکس clock_gettime وجود داشته باشه

مصطفی ساتکی
چهارشنبه 15 آذر 1391, 15:35 عصر
تو لینوکس می تونید از "sys/time.h" وتابع gettimeofday استفاده کنید.
در ضمن حلقه for رو زمان چشمگیری نداره تعداد کلاک ها رو محاسبه کنید یعنی محاسبات شما بر حسب تعداد کلاک باشه .
در این پست (http://www.7khatcode.com/1669/%D9%85%D8%AD%D8%A7%D8%B3%D8%A8%D9%87-%D8%B2%D9%85%D8%A7%D9%86-%D8%A7%D8%AC%D8%B1%D8%A7%DB%8C%DB%8C-%D9%82%D8%B7%D8%B9%D9%87-%DA%A9%D8%AF-c?show=1669#q1669)کاملاً توضیح داده شده.

مصطفی ساتکی
چهارشنبه 15 آذر 1391, 15:36 عصر
تو لینوکس می تونید از "sys/time.h" وتابع gettimeofday استفاده کنید.
در ضمن حلقه for رو زمان چشمگیری نداره تعداد کلاک ها رو محاسبه کنید یعنی محاسبات شما بر حسب تعداد کلاک باشه .