سلام دوستان
من یک برنامهی ساده C دارم که به صورت زیر عمل میکنه :
در ابتدای کار یک آرایهی 1,000,000 تایی رو با اعداد رندم پر میکنه (پ.ن ۱)
سپس توسط تابع merge sort (و یا quick sort) که توسط خودم نوشته شده (از توابع آماده استفاده نشده) آرایه مرتب میشه
قبل از اینکه بخش مرتب سازی شروع بشه با استفاده از
clock_t start = clock();
زمان شروع رو تعیین میکنه (پ.ن ۲)
و پس از مرتب سازی با استفاده از
clock_t stop = clock();
زمان پایان رو تعیین میکنه
حالا تفاضل این دو رو پرینت کنه که در واقع میشه زمان اجرای برنامه
چندین بار برنامه رو روی سیستم خودم و سیستم دانشگاه اجرا کردم و نتایج برام عجیب بود
خروجیها روی سیستم خودم (پ.ن ۳) بین 200ms تا 400ms متغییره و هربار نتیجه در این بازه تغییر میکنه
اما خروجی روی سیستم دانشگاه که یک توزیع لایو (پ.ن ۳) روی اون اجرا شده بود تغیرات زمانی بسیار بسیار کم و قابل چشم پوشی داشت در حدود 300ms بود
سوالهای بنده اینه :
۱. چرا برنامهای که فقط یک کار ثابت رو انجام میده ، هر بار در زمان متفاوتی اجرا میشه (منظورم روی سیستم خودم هست) ؟ آیا من جایی اشتباه کردم و یا به دلیل دیگری این اتفاق میافتد؟
۲. آیا این تفاوت در سیستم خودم مربوط به سیستمعامل هست و یا زبان برنامهنویسی ؟ و اینکه آیا قابل حل هست یا خیر ؟
پ.ن ۱:
در ابتدای برنامه از
srand(0);
استفاده کردم که هر بار اعداد ثابتی توسط تابع رندوم تولید بشه . بنظرم این کار باعث میشه شرایط برابرتر باشه برای هربار اجرا
پ.ن ۲:
در مورد نحوهی کار تابع clock و عملیاتی که انجام میده دقیق مطلع نیستم. اما ظاهرا تعداد کلاکهای اشغالی توسط برنامه رو میشماره و در نهایت توسط
double time = (double)(stop - start) * 1000 / CLOCKS_PER_SEC;
قابل محاسبه هست
پ.ن ۳:
مشخصات سیستم خودم : یک لپتاپ اوبونتو ۱۶.۰۴ - ۶گیگابایت رم و پردازنده intel core i7
مشخصات سیستم دانشگاه : یک پیسی با لوبونتو ۱۶.۰۴ که به صورت لایو بالا اومده - ۴ گیگابایت رم
پ.ن ۴:
در طول برنامه هیچ عملیات ورودی انجام نمیشه و تمام کارها داخل خود برنامه انجام میشن
تنها قسمتی از کد هم که زمانش ثبت میشه ، قسمت مرتب سازی هست که تابع اون به صورت بازگشتی هست
ضمیمه ۱ : نتیجه روی سیستم خودم
ضمیمه ۲ : merge sort
ضمیمه ۳ : quick sort
عذرخواهی میکنم که طولانی شد
با تشکر