تور لحظه آخری
امروز : جمعه ، 7 اردیبهشت 1403    احادیث و روایات:  امام رضا (ع):هیچ بنده اى حقیقت ایمانش را کامل نمى کند مگر این که در او سه خصلت باشد: دین شناسى، تدبر...
سرگرمی سبک زندگی سینما و تلویزیون فرهنگ و هنر پزشکی و سلامت اجتماع و خانواده تصویری دین و اندیشه ورزش اقتصادی سیاسی حوادث علم و فناوری سایتهای دانلود گوناگون شرکت ها

تبلیغات

بلومبارد

تبلیغات متنی

تریدینگ ویو

خرید اکانت اسپاتیفای

کاشت ابرو

لمینت دندان

ونداد کولر

لیست قیمت گوشی شیائومی

صرافی ارکی چنج

صرافی rkchange

دانلود سریال سووشون

دانلود فیلم

ناب مووی

تعمیر کاتالیزور

تعمیر گیربکس اتوماتیک

دیزل ژنراتور موتور سازان

سرور اختصاصی ایران

سایت ایمالز

تور دبی

سایبان ماشین

جملات زیبا

دزدگیر منزل

ماربل شیت

تشریفات روناک

آموزش آرایشگری رایگان

طراحی سایت تهران سایت

آموزشگاه زبان

اجاره سند در شیراز

ترازوی آزمایشگاهی

رنگ استخری

فروش اقساطی کوییک

راهبند تبریز

ترازوی آزمایشگاهی

قطعات لیفتراک

وکیل تبریز

خرید اجاق گاز رومیزی

آموزش ارز دیجیتال در تهران

شاپیفای چیست

فروش اقساطی ایران خودرو

واردات از چین

قیمت نردبان تاشو

وکیل کرج

تعمیرات مک بوک

قیمت فنس

armanekasbokar

armanetejarat

صندوق تضمین

سیسمونی نوزاد

پراپ تریدینگ معتبر ایرانی

نهال گردو

صنعت نواز

پیچ و مهره

خرید اکانت اسپاتیفای

صنعت نواز

لوله پلی اتیلن

کرم ضد آفتاب لاکچری کوین SPF50

دانلود آهنگ

طراحی کاتالوگ فوری

واردات از چین

اجاره کولر

دفتر شکرگزاری

تسکین فوری درد بواسیر

دانلود کتاب صوتی

تعمیرات مک بوک

 






آمار وبسایت

 تعداد کل بازدیدها : 1797983634




هواشناسی

نرخ طلا سکه و  ارز

قیمت خودرو

فال حافظ

تعبیر خواب

فال انبیاء

متن قرآن



اضافه به علاقمنديها ارسال اين مطلب به دوستان آرشيو تمام مطالب
archive  refresh

اندازه گیری زمان اجرا -


واضح آرشیو وب فارسی:سایت ریسک: اندازه گیری زمان اجرا farzaneh0 30 فروردين 1389, 17:43با سلام آقا خواهش می کنم محض رضای خدا یکی کمکم کنه من چند وقت است می خواهم زمان اجرای برنامه ام را با کد زیر اندازه گیری کنم ولی همش زمان صفر را می ده باور کنید حتی برنامه ام را 200 بار فراخوانی کرده ام تا زمانش طولانی شود ولی نتیجه ای نداشته کمکم کنید clock_t begin,end; begin=clock(); برنامه ای که می خوام زمان آن را اندازه گیری کنم end=clock(); d=((end-begin)*1000)/CLOCKS_PER_SEC; cout<<d the_king 31 فروردين 1389, 01:09با سلام آقا خواهش می کنم محض رضای خدا یکی کمکم کنه من چند وقت است می خواهم زمان اجرای برنامه ام را با کد زیر اندازه گیری کنم ولی همش زمان صفر را می ده باور کنید حتی برنامه ام را 200 بار فراخوانی کرده ام تا زمانش طولانی شود ولی نتیجه ای نداشته کمکم کنید clock_t begin,end; begin=clock(); برنامه ای که می خوام زمان آن را اندازه گیری کنم end=clock(); d=((end-begin)*1000)/CLOCKS_PER_SEC; cout<<d فرض های مساله : توابع ()MyFunction1 و ()MyFunction2 توابعی هستند که قصد مقایسه کردن سرعت اجرایشان را دارید. زمانی که برای اجرا های متوالی هر کدام از ایندو تابع صرف خواهید کرد (بر حسب ثانیه ) را t می نامیم که در کد مثال 5 ثانیه خواهد بود. تابع ()round برای محاسبه کردن عملیات ریاضی گرد کردن عدد اعشاری به نزدیکترین عدد صحیح بدون اعشار بکار می رود. تابع ()CompareResults بر اساس تعداد اجرا های تو تابع در طی زمان t و حذف کردن تغییرات کوچکی که ممکن است در هر بار اجرا تغییر کنند، تابع برنده (سرعت اجرای بیشتر) و میزان درصدی که سرعتش از تابع بازنده بیشتر است را بر می گرداند. #include <iostream> #include <math.h> using namespace std; const clock_t t = 5; double round(double x) { double n = floor(x); double m = ceil(x); return (fabs(x - n) < fabs(x - m)) ? n : m; } void CompareResults(long count1, long count2, long *percent, int *winner) { double factor; if (count1 < count2) { factor = ((double)count2 / (double)count1 - 1) * 100; *winner = 2; } else { factor = ((double)count1 / (double)count2 - 1) * 100; *winner = 1; } if (factor < 100) { *percent = 0; *winner = 0; } else { long base = (long)round(pow(10, floor(log10(factor)))); *percent = (long)(round((double)factor / base) * base); } } long MyFunction1() { long sum = 0; for (int i = 1; i <= 1000; i++) sum += i; return sum; } long MyFunction2() { long sum = (1000 + 1) * (1000 / 2); return sum; } int main() { clock_t end; long count1 = 0, count2 = 0; cout << "Please wait...it take " << t << " seconds." << endl; end = clock() + CLOCKS_PER_SEC * t; while (clock() < end) { MyFunction1(); count1++; } cout << "Please wait...it take " << t << " seconds." << endl; end = clock() + CLOCKS_PER_SEC * t; while (clock() < end) { MyFunction2(); count2++; } int winner; long percent; CompareResults(count1, count2, &percent, &winner); switch (winner) { case 1 : cout << "MyFunction1 is " << percent << "% faster than Myfunction2." << endl; break; case 2 : cout << "MyFunction2 is " << percent << "% faster than Myfunction1." << endl; break; default : cout << "MyFunction1 and Myfunction2 have the same speed." << endl; } return 0; } farzaneh0 31 فروردين 1389, 17:37دوست عزیز ممنون از لطفت ولی مشکل فعلی من این است که زمان اجرای یک برنامه را اندازه گیری کنم که متاسفانه همش صفر میده. اگه راهنماییم کنید بینهایت ممنون می شم the_king 01 ارديبهشت 1389, 00:59دوست عزیز ممنون از لطفت ولی مشکل فعلی من این است که زمان اجرای یک برنامه را اندازه گیری کنم که متاسفانه همش صفر میده. اگه راهنماییم کنید بینهایت ممنون می شم لطفا در متن پست هایتان کد های طولانی را نقل قول نکنید، بی جهت متن صفحه را طولانی می کند. کد زیرزمان اجرای یک تابع را بر حسب ثانیه اندازه گیری می کند : #include <iostream> #include <math.h> using namespace std; const clock_t t = 5; double round(double x) { double n = floor(x); double m = ceil(x); return (fabs(x - n) < fabs(x - m)) ? n : m; } long MyFunction() { long sum = 0; for (int i = 1; i <= 1000; i++) sum += i; return sum; } int main() { clock_t end; long count = 0; cout << "Please wait...it take " << t << " seconds." << endl; end = clock() + CLOCKS_PER_SEC * t; while (clock() < end) { MyFunction(); count++; } double elap = (double)t / (double)count; cout.precision(15); cout.setf(ios::fixed); cout << "Elapsed time for MyFunction = " << elap << " sec" << endl; return 0; } farzaneh0 04 ارديبهشت 1389, 17:52دوست عزیز مطمئنی کدت درست است من که این کد را نوشتم برنامه در حالت اجرا موند و اصلا زمان اجرا را نشان نداد من الان تنها مشکلم این است که می خواهم زمان اجرای یک برنامه را اندازه گیری کنم ولی جواب زمان اجرا همیشه صفر است؟؟؟ the_king 05 ارديبهشت 1389, 02:51دوست عزیز مطمئنی کدت درست است من که این کد را نوشتم برنامه در حالت اجرا موند و اصلا زمان اجرا را نشان نداد من الان تنها مشکلم این است که می خواهم زمان اجرای یک برنامه را اندازه گیری کنم ولی جواب زمان اجرا همیشه صفر است؟؟؟ بله، مطمئن ام. این هم فایل اجرایی اش که ضمیمه پست شده. farzaneh0 06 ارديبهشت 1389, 22:04دوست عزیز ممنون درست گفتی کد را دوباره با دقت اجرا کردم درست جواب داد در ضمن باور کن از صمیم قلب هم برای شما دعا کردم به خاطر کمک بزرگی که کردی فقط دوست عزیز یک سوال دیگه داشتم (البته ببخشید) و آن اینکه برنامه من به ازای ورودی یکسان هر بار زمان اجرایش کمی متفاوت با دفعه قبل است به نظرت همین را به عنوان زمان اجرای برنامه در نظر بگیرم یا میانگین چند بار اجرای آن؟؟ در ضمن اگه درست فهمیده باشم کد شما می بینه که در مدت 5 ثانیه برنامه چند بار اجرا میشه سپس همین زمان 5 ثانیه را بر تعداد دفعات اجرا تقسیم می کنه درسته؟؟؟ the_king 07 ارديبهشت 1389, 01:09دوست عزیز ممنون درست گفتی کد را دوباره با دقت اجرا کردم درست جواب داد در ضمن باور کن از صمیم قلب هم برای شما دعا کردم به خاطر کمک بزرگی که کردی فقط دوست عزیز یک سوال دیگه داشتم (البته ببخشید) و آن اینکه برنامه من به ازای ورودی یکسان هر بار زمان اجرایش کمی متفاوت با دفعه قبل است به نظرت همین را به عنوان زمان اجرای برنامه در نظر بگیرم یا میانگین چند بار اجرای آن؟؟ فرق چندانی نمی کنه، چون در هر صورت زمان اجرای برنامه ای که بدست می آید مستقل از وضعیتی که سیستم عامل در همون لحظه اجرا داشته نیست و چون سیستم عامل در هر لحظه بار ترافیکی پردازشی و ورودی/خروجی متفاوتی داره، در هیچ حالتی زمان بدست آمده مستقل نخواهد بود. در ضمن اگه درست فهمیده باشم کد شما می بینه که در مدت 5 ثانیه برنامه چند بار اجرا میشه سپس همین زمان 5 ثانیه را بر تعداد دفعات اجرا تقسیم می کنه درسته؟؟؟ دقیقا همینطوره. farzaneh0 11 ارديبهشت 1389, 17:36یعنی هیچ کاری نمیشه کرد که زمان اجرای برنامه را بطور خالص در نظر گرفت (بدون دخالت پردازشهای دیگر) آخه وقتی من می خوام زمان اجرای چند برنامه را با هم مقایسه کنم و یکیش به ازای ورودی یکسان یکبار مثلا 0000242/0 است و بار دیگر 0000270/0 و دیگری هم به ازای ورودی یکسان یکبار 0000264/0 است و بار دیگر 0000280/. بالخره نمی توان گفت که زمان برنامه دومی از اولی کمتر است یا بیشتر!!!! این مسئله به یک مشکل اساسی برای تز فوق لیسانس من تبدیل شده. the_king 11 ارديبهشت 1389, 23:02یعنی هیچ کاری نمیشه کرد که زمان اجرای برنامه را بطور خالص در نظر گرفت (بدون دخالت پردازشهای دیگر) آخه وقتی من می خوام زمان اجرای چند برنامه را با هم مقایسه کنم و یکیش به ازای ورودی یکسان یکبار مثلا 0000242/0 است و بار دیگر 0000270/0 و دیگری هم به ازای ورودی یکسان یکبار 0000264/0 است و بار دیگر 0000280/. بالخره نمی توان گفت که زمان برنامه دومی از اولی کمتر است یا بیشتر!!!! این مسئله به یک مشکل اساسی برای تز فوق لیسانس من تبدیل شده. قرنطینه کردن cpu که نه، در سیستم عامل ویندوز نمیشه بطور کامل اینکار رو کرد. در dos وضعیت بهتری هست، اما با مادربورد ها و cpu های قدیمی که رابطه دقیقی بین کد ماشین و زمان اجرا بود. وقتی زمان اجرای یک کد برنامه ثابت نباشه، زمان اجرای خالص مفهومی نداره که بخواهید مشخص اش کنید. زمان اجرای خالص فقط روی کاغذ بدست می یاد، کوچکترین تغییری در ولتاژ cpu یا اجرای همزمان چند پردازه و درخواست i/o و صد ها تکنولوژی پیچیده داخل cpu مانع از تعیین کردن دقیق زمان اجرا میشه. اگه قصد تون مقایسه دقیق کارایی دو کد برنامه است، با بررسی کد ماشین برنامه کامپایل شده و بدست آوردن مجموع تعداد کلاک پالس ها با استفاده از جدول دستورات پردازنده، می توانید بطور دقیق مشخص کنید که مثلا برای اندازه داده ورودی فلان، این کد فلان تعداد کلاک پالس صرف می کنه. اما بدست آوردن زمان مورد نیاز برای اون تعداد کلاک پالس ها ثابت و دقیق نیست، چون در یک پردازنده مدرن که چند هسته ای حقیقی یا مجازی است، و با مادربورد های مدرن که بطور متغیر ولتاژ cpu و فرکانس کاری اش را کنترل می کنند، و با یک سیستم عامل چند پردازه ای مدرن، زمان اجرای کد بازه متغیری داره. farzaneh0 12 ارديبهشت 1389, 21:16یعنی تمام مقالاتی که زمان اجرای چند برنامه را اندازه گرفته و با هم روی نمودار مقایسه کرده اند از همین کدی که شما برای اندازه گیری زمان اجرا فرمودید استفاده کرده اند و برای یک ورودی مشخص که هر دفعه زمان اجراش با دفعه پیش متفاوت است یکی را به عنوان زمان اجرای آن در نظر گرفته اند؟؟؟ the_king 12 ارديبهشت 1389, 22:59یعنی تمام مقالاتی که زمان اجرای چند برنامه را اندازه گرفته و با هم روی نمودار مقایسه کرده اند از همین کدی که شما برای اندازه گیری زمان اجرا فرمودید استفاده کرده اند و برای یک ورودی مشخص که هر دفعه زمان اجراش با دفعه پیش متفاوت است یکی را به عنوان زمان اجرای آن در نظر گرفته اند؟؟؟ اندازه گیری زمان اجرا در یک سیستم نمونه فقط یکی از روش های مقایسه کردن سرعت اجرای کد ها است و کد هایی که زمان اجرای شان را با هم مقایسه می کنند در حد چند میلی ثانیه نیستند و طبیعتا اختلاف بین شان آنقدر محسوس هست که اختلاف های صدم ثانیه ای تاثیری در نتیجه گیری نداشته باشد. مثلا مقایسه کردن سرعت مرتب سازی حبابی و درجی برای اندازه داده های ورودی 10000 و 100000 Bubble Sort 10,000 Bubble Sort 100,000 Random Numbers Random Numbers Time 0.366 sec. 36.702 sec. Insertion Sort 10,000 Insertion Sort 100,000 Random Numbers Random Numbers Time 0.055 sec. 5.392 sec. طبیعتا اگر اندازه داده های ورودی را در حد 10 می گرفتند، مقایسه ایندو کد با روش اندازه گیری زمان اجرا عملی نبود. farzaneh0 13 ارديبهشت 1389, 17:25خب آخر من برنامه ام جوری است که امکان اجرای آن برای داده های خیلی بزرگ نیست؟ به نظرتان چکار کنم؟؟؟ the_king 14 ارديبهشت 1389, 01:26خب آخر من برنامه ام جوری است که امکان اجرای آن برای داده های خیلی بزرگ نیست؟ به نظرتان چکار کنم؟؟؟ کدتان را داخل یک حلقه for با تعداد تکرار زیاد بندازید تا هر بار اجرایش چند ثانیه ای طول بکشد، هر چه که تعداد تکرار ها بیشتر باشد، تفاوت های کوچک میان دو کد بیشتر مشخص می شود : long x = 0; for (x = 0; x < 500000; x++) { } farzaneh0 14 ارديبهشت 1389, 16:53خب فکر کنم باید مجموع زمان اجراها را هم بر تعداد تکرارها تقسیم کنم و در واقع میانگین بگیرم درسته؟؟؟ the_king 14 ارديبهشت 1389, 18:59خب فکر کنم باید مجموع زمان اجراها را هم بر تعداد تکرارها تقسیم کنم و در واقع میانگین بگیرم درسته؟؟؟ نه، منظورم میانگین نبود، اگر بخواهید میانگین بگیرید باید مدام بین هر بار اجرا زمان اجرا را اندازه گیری کنید و جمع بزنید که چون خود کد زمان اجرای کمی دارد، این صرف کردن زمان اضافی اندک برای زمانگیری هم تاثیر نامطلوب خواهد داشت. منظورم این بود که در نتایج بجای درج کردن زمان سپری شده برای یکبار اجرا، زمان سپری شده برای مثلا 100000 بار اجرا رو ذکر کنید، در واقع واحد اندازه گیری را تغییر دهید، همانطور که فاصله بین شهر ها را بجای متر که واحد اصلی است و دقیق تر هم هست به کیلومتر اعلام می کنند. farzaneh0 17 ارديبهشت 1389, 08:41خب دوست عزیز با کدی که شما برای اندازه گیری زمان اجرا به من گفتید اینطور بود که مثلا تعداد دفعات اجرای برنامه را در مدت 5 ثانیه اندازه گیری می کردیم و بعد 5 ثانیه را بر تعداد دفعات اجرا تقسیم می کردم حالا با این روش که بخواهم داخل حلقه for زمان اجرای برنامه را به ازای 10000 بار اجرا بدست آورم نمی شود مگر اینکه همان زمان حاصل از تقسیم 5 ثانیه بر تعداد دفعات اجرا را در 10000 ضرب کنم تا به جای زمان اجرای یک بار برنامه زمان اجرای 10000 بار برنامه بدست بیاد درسته؟؟؟ the_king 17 ارديبهشت 1389, 12:12خب دوست عزیز با کدی که شما برای اندازه گیری زمان اجرا به من گفتید اینطور بود که مثلا تعداد دفعات اجرای برنامه را در مدت 5 ثانیه اندازه گیری می کردیم و بعد 5 ثانیه را بر تعداد دفعات اجرا تقسیم می کردم حالا با این روش که بخواهم داخل حلقه for زمان اجرای برنامه را به ازای 10000 بار اجرا بدست آورم نمی شود مگر اینکه همان زمان حاصل از تقسیم 5 ثانیه بر تعداد دفعات اجرا را در 10000 ضرب کنم تا به جای زمان اجرای یک بار برنامه زمان اجرای 10000 بار برنامه بدست بیاد درسته؟؟؟ از نظر منطق ریاضی کاملا درسته، البته در عمل بدلیل ساختار اعداد اعشاری با ممیز شناور کمی خطا در محاسبه خواهد داشت، اما تقریبا همون میشه.




این صفحه را در گوگل محبوب کنید

[ارسال شده از: سایت ریسک]
[مشاهده در: www.ri3k.eu]
[تعداد بازديد از اين مطلب: 1774]

bt

اضافه شدن مطلب/حذف مطلب







-


گوناگون

پربازدیدترینها
طراحی وب>


صفحه اول | تمام مطالب | RSS | ارتباط با ما
1390© تمامی حقوق این سایت متعلق به سایت واضح می باشد.
این سایت در ستاد ساماندهی وزارت فرهنگ و ارشاد اسلامی ثبت شده است و پیرو قوانین جمهوری اسلامی ایران می باشد. لطفا در صورت برخورد با مطالب و صفحات خلاف قوانین در سایت آن را به ما اطلاع دهید
پایگاه خبری واضح کاری از شرکت طراحی سایت اینتن