انجمن‌های فارسی اوبونتو

لطفاً به انجمن‌ها وارد شده و یا جهت ورود ثبت‌نام نمائید

لطفاً جهت ورود نام کاربری و رمز عبورتان را وارد نمائید


توزیع گنو/لینوکس اوبونتو ۲۰ ساله شد 🎉

نویسنده موضوع: ثابت نبودن زمان اجرای یک کد C  (دفعات بازدید: 1452 بار)

0 کاربر و 2 مهمان درحال مشاهده موضوع.

آفلاین abedzadeh

  • High Hero Member
  • *
  • ارسال: 1597
  • جنسیت : پسر
  • aliila
ثابت نبودن زمان اجرای یک کد C
« : 10 اسفند 1395، 11:45 ب‌ظ »
سلام دوستان
من یک برنامه‌ی ساده 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

عذرخواهی میکنم که طولانی شد :)
با تشکر

« آخرین ویرایش: 11 اسفند 1395، 12:29 ق‌ظ توسط abedzadeh »
به گروه کاربران اوبونتوی ایرانی در جامعه ی استیم بپیوندید
http://steamcommunity.com/groups/Ubuntu-Iran
بازی های تحت پوشش : Dota2

آفلاین مجتبی باغبان

  • Hero Member
  • *
  • ارسال: 780
  • جنسیت : پسر
پاسخ : ثابت نبودن زمان اجرای یک کد C
« پاسخ #1 : 10 اسفند 1395، 11:59 ب‌ظ »
به نظر من به دلیل این است که شما کنترلی روی تخصیص منابع سیستم مثل سی پی یو به برنامه‌ها ندارین و مثلا یک برنامه که در پس زمینه در حال اجراست درخواست استفاده از سی پی یو میده و سیستم عامل بر اساس الگوریتم خودش نتیجه میگیره که سی پی یو رو به اون برنامه اختصاص بده و برنامه شما باید منتظر بمونه تا دسترس به سی پی یو پیدا کنه و در نتیجه مدت زمان بیشتری طول میکشه تا اجراش کامل بشه

آفلاین abedzadeh

  • High Hero Member
  • *
  • ارسال: 1597
  • جنسیت : پسر
  • aliila
پاسخ : ثابت نبودن زمان اجرای یک کد C
« پاسخ #2 : 11 اسفند 1395، 07:26 ب‌ظ »
به نظر من به دلیل این است که شما کنترلی روی تخصیص منابع سیستم مثل سی پی یو به برنامه‌ها ندارین و مثلا یک برنامه که در پس زمینه در حال اجراست درخواست استفاده از سی پی یو میده و سیستم عامل بر اساس الگوریتم خودش نتیجه میگیره که سی پی یو رو به اون برنامه اختصاص بده و برنامه شما باید منتظر بمونه تا دسترس به سی پی یو پیدا کنه و در نتیجه مدت زمان بیشتری طول میکشه تا اجراش کامل بشه
ممنون بابت پاسختون ، بنده هم ابتدا همینطور فکر میکردم اما زمانی که روی سیستم‌های دانشگاه کدم رو تست کردم این فرضم رد شد
به احتمال زیاد به چیز دیگه‌ای مربوط هست و یا شاید نتیجه‌گیری بنده غلط بوده

در عکس پیوست نتیجه‌ی چندین بار اجرای کد روی سیستم‌های دانشگاه نمایش داده شده که همونطور که گفتم کاملا قابل چشم‌پوشی هست درحالی که نتیجه روی سیستم خودم طور دیگه‌ای هست
به گروه کاربران اوبونتوی ایرانی در جامعه ی استیم بپیوندید
http://steamcommunity.com/groups/Ubuntu-Iran
بازی های تحت پوشش : Dota2

آفلاین Geek

  • High Hero Member
  • *
  • ارسال: 1116
  • جنسیت : پسر
  • The answer to life the universe and everything: 42
پاسخ : ثابت نبودن زمان اجرای یک کد C
« پاسخ #3 : 11 اسفند 1395، 09:35 ب‌ظ »
آزمایشت کنترل شده نیست ;D
روی سیستم خودت لوبونتو رو لایو بیار بالا و تست کن.

آفلاین abedzadeh

  • High Hero Member
  • *
  • ارسال: 1597
  • جنسیت : پسر
  • aliila
پاسخ : ثابت نبودن زمان اجرای یک کد C
« پاسخ #4 : 11 اسفند 1395، 11:34 ب‌ظ »
آزمایشت کنترل شده نیست ;D
روی سیستم خودت لوبونتو رو لایو بیار بالا و تست کن.
والا زیاد در مورد کنترل کردن آزمایش‌های اینچنینی اطلاعی ندارم  ;D
ولی تست کردم و نتیجه شد مثل اوبونتوی خودم ، یعنی تغییرات قابل توجه هست
به گروه کاربران اوبونتوی ایرانی در جامعه ی استیم بپیوندید
http://steamcommunity.com/groups/Ubuntu-Iran
بازی های تحت پوشش : Dota2

آفلاین احمد حقیقی

  • Full Member
  • *
  • ارسال: 229
  • جنسیت : پسر
  • MrRolling
پاسخ : ثابت نبودن زمان اجرای یک کد C
« پاسخ #5 : 12 اسفند 1395، 01:00 ق‌ظ »
مشخصات پردازنده ات (مثلا فرکانس) و سایر برنامه هایی که در حال اجرا هستند تاثیر گذاره روش
درضمن سیستم عامل هم موثره هست که در اینجا چون از یک سیستم عامل استفاده میکنید،‌فرقی نداره به نظرم
“Open source is a development methodology; free software is a social movement”

آفلاین فاروق

  • Hero Member
  • *
  • ارسال: 992
  • جنسیت : پسر
  • <شعار>این یک شعار است</شعار>
    • تارنمای فاروق
پاسخ : ثابت نبودن زمان اجرای یک کد C
« پاسخ #6 : 13 فروردین 1396، 12:17 ب‌ظ »
خب الآن این سوال من هم هست، یک برنامه سی داریم که بر اساس vigenere تمام بایت های یک فایل رو تغییر داده و توی یک فایل خروجی مینویسه، نتیجه پیوست شد.
http://pcworms.blog.ir
بعد از بررسی پست های قدیمیم، فکر میکنم یک عذرخواهی بدهکارم! معذرت میخوام و اگر اشتباه کردم مستقیم و روشن راهنمایی کنید تا تکرار نکنم.
کانال IRC