این کد رو ببینید
نقل قول: Dim arr(0 To 18000, 0 To 18000) As Byte
Private Sub Form_Load()
startTime = Timer()
For i = 1 To 18000
For j = 0 To 18000
arr(j, i) = 0
Next
Next
Text1.Text = Timer - startTime
DoEvents
startTime = Timer()
For i = 1 To 18000
For j = 0 To 18000
arr(i, j) = 0
Next
Next
Text1.Text = Text1.Text & vbCrLf & (Timer - startTime)
End Sub
این کد جز صفر کردن عناصر یک آرایه کار خاص دیگه ای انجام نمیده و این عمل رو دوبار انجام میده یک بار سطری یک بار ستونی ولی از نظر زمان اجرا دو جواب متفاوت بهت میده (مثلا باری کامپیتوری با 1 مگ رام اولی 60 ثانیه و دومی 79 ثانیه طول میکشه) هرچی رامت کمتر باشه تفاوت خیلی مشهودتر میشه.
میدونم مثالها از این دست زیاده ولی میخواستم ببینید چقدر تکنیک صفحه بندی سیستم عامل میتونه توی الگوریتم تاثیر بزاره و زمان اجرا رو متفاوت کنه.
بروی سیستم من
اولی 33
دومی 128
Ram 768
ashkan نوشته است:...میخواستم ببینید چقدر تکنیک صفحه بندی سیستم عامل میتونه توی الگوریتم تاثیر بزاره...
ممنون واقعا نکته جالبی بود
البته تنها دلیل این تفاوت صفحه بندی نیست ولی یکی از مهمترینهاش اینه.
اگه لطف کنید دو تا مطلب رو توضیح بدید ممنون می شم.
اول اینکه صفحه بندی چیه و دقیقا چرا زمان انجام این دو تا تفاوت داره ( ماتریس رو فهمیدم ولی ربطش به سیستم عامل و این که الگریتم سیستم عامل چطور این کار رو انجام می ده نه)
دوم اینکه اشکان خان گفتید با یه میگ رم!!! امتحان کردید؟!؟!؟!؟!! و هرچی رم پائین تر باشه تفاوت بیشتر نشون داده می شه؟! !!!!!!!
حالا یا "رام" همون "رم" نیست (Ram & Rom ) یا اینکه .....
وقتی میخواد برنامه ای اجرا بشه باید بیاد توی حافظه برای آوردن برنامه به حافظه باید دید آیا حافظه جا داره یا نه .
در سیستم عامل های موجود که میشه در آن واحد چند برنامه رو اجرا کرد روش آوردن برنامه به حافظه میتونه متفاوت باشد چند روش داریم که عببارتند از سوآپینگ - سگمنتیشن - پیجینگ و ویرچوال مموری.
در روش پیجینگ حافظه به قطعات خاصی تقسیم میشه (ویندوز 4کیکوبایتی) و بهش صفحه گفته میشه این برنامه ها میان میشینن توی صفحات اگر حافظه کم باشه از کل برنامه فقط تعداد کمی صفحه میاد تو حافظه و در صورت نیاز به صفحه های جدید. اول صفحه قبلی خالی میشه و صفحه جدید میشینه جاش(این کار توسط سیستم عامل انجام میشه) این کار زمان بر و وقت گیر هست پس اگه برنامه ای تعداد صفحه های زیادی بخواد موقع اجرا زمان زیادی هم مصرف الکی میشه تا هی صفحه ها بیان تو حافظه بعد از اجرا حذف بشن و جاشون صفحه جدید بیاد.
اگه دیده باشید تو برنامه بالا یک بار آرایه سطری جلو رفته یه بار ستونی بسته به اینکه آرایه توسط کامپایلر توی حافظه چطور بشینه (سطری یا ستونی) جستجو فرق میکنه .
به زبون ساده فرض کن دو صفحه بیشتر حافظه خالی نداریم.(هر صفحه هم 1 کیلو بایت) آرایه ما هم اینه
A( 1 to 4,1 to 1024 )
برا این آرایه ما 4 صفحه لازم داریم
حالا اگه آرایه ما سطری باشه تو حافظه یعنی a(1,1 to 1024) توی صفحه اوله و 1024 تای بعدی توی صفحه دوم پس اول دو صفحه اول و دوم دادهاشون صفر میشه بعد دو صفحه سوم و چهارم میان تو حافظه(داده های اول یه جایی ذخیره میشن فعلا گیر نده) بعدش این دوتا صفر میشن.
حالا فرض کن دادها بجای سطری ستونی ذخیره بشن توی حلقه
1- اول صفحه مربوط به 1024 تای اول میاد تو حافظه و بایت اولش صفر میشه A(1,1 to 1024) و بایت اولش میشه
A(1,1)
2- چون حالا میخواییم این داده دوم رو صفر کنیم یعنی A(2,1) پس باید صفحه دوم بیاد بالا یعنی فعلا دو صفحه میاد بالا
3- حالا میخواییم این داده رو صفر کنیم a(3,1) باز باید یه صفحه دیگه بیاد بالا
4- همینطور مثل بالا
خوب میبینید که در این روش بجای اینکه 4 بار و 4 صفحه برای کل برنامه بیاد بالا بجاش 4*1024 بار داده ها منتقل میشه به حافظه که خیلی وحشتناک و وقت گیره.
دیدید گاهی وقتا چراغ هاردتون روشنه در صورتی که هیچ کار خاصی انجام نمیدید این زمانیه که داره صفحه بندی سنگینی میکنه و هی صفحه های الکی رو میریزه به هارد یا از هارد برمیداره.
خیلی ممنونم . اولین باره دارم با معماری سیستم عامل آشنا می شم و برام خیلی جالبه.