تازه متوجه شدم که شما داری به چی اشاره می کنی
منظورتون اون یک باری که کد بیشتر از اون اجرا می شه
البته اون یک بار با این که اتوی فور هم هست نباید ایقدر اختلاف ایجاد کنه مشکل اصلی مال اوون جایی بود که متغیر حله و تعریف کردیم
برخلاف نظ شما این دو تا حلقه فور با هم اختلاف دارن و اونی که متغیرر حلقه توی خود حلقه تعریف می شه خیلی سریعتر . حتی اگه اون حلقه باز توی یه حلقه دیگه باشه
یعنی
int m, n as int16
for m=1 to 100
for n=1 to 100
..
next
next
کنتدتر از کد زیر اجرا می شه
for m as int16=1 to 100
for n as int16=1 to 100
..
..
next
next
من در این باره یه تاپیک ایجاد کردم که آدرش توی هین تاپیک هست
یکی از مدیران ارشد سایت هم جواب داد و دلیلش رو توضیح داد
خوب البته یه بار نبود . بلکه به ازای هر یه بار اضافه در حلقه ی بیرونی حلقه داخلی 1000 بار بیشتر اجرا می شد . البته از جهت اینکه قرار بود کد رو برای مایکروسافت ایمیل کنن یه کم قضیه حیثیتی بود .
شما از من در مورد یک حلقه سوال کردید . اما این که الان میگید فرق داره دو تا حلقه ی تو در توه .برخلاف نظ شما این دو تا حلقه فور با هم اختلاف دارن و اونی که متغیرر حلقه توی خود حلقه تعریف می شه خیلی سریعتر . حتی اگه اون حلقه باز توی یه حلقه دیگه باشه
یعنی
int m, n as int16
for m=1 to 100
for n=1 to 100
..
next
next
کنتدتر از کد زیر اجرا می شه
for m as int16=1 to 100
for n as int16=1 to 100
..
..
next
next
من در این باره یه تاپیک ایجاد کردم که آدرش توی هین تاپیک هست
یکی از مدیران ارشد سایت هم جواب داد و دلیلش رو توضیح داد
پیشنهاد من به شما اینه که یه زحمتی بکشید برنامه رو با تعداد تکرار بالا و با یه حلقه بنویسید . یه بار به صورتی که شمارنده در دستور for تعریف بشه و یه بار هم قبلش از حلقه تعریف کنید
برنامه ها رو ریلیز کنید . فایل PDB رو از فولدر پاک کنید و حالا دو تا برنامه رو (exe ها رو ) اجرا کنید .و نتیجه رو بگین . انتظار من زمان برابره.
دوست عزیز من دقیقا همین کاری که شما می گید رو کردم و نتیجه این شد که اونی که متغیرر توی فور تعریف می شه سریعتر در حالی که من انتظار عکس این رو داشتم . گفتم تو اون تاپیکی که گفتم یکی از مدیزای ارشد اومد و توضیح داد که چرا اون کد سریعتر
درحالی که من انتظار داشتم چون توی فور داخلی متغیر حلقهش به ازای هر بار اجرای حلقه بیرونی یه بار تکرار می شه کندترع
من اون تاپیک رو خوندم . اما هنوز دارم میگم این دو تا کد برابرند .
SOURCE="vb"]
Option Strict On
Public Class Form1
Declare Function QueryPerformanceCounter Lib "kernel32.dll" (ByRef x As Int64) As Byte
Declare Function QueryPerformanceFrequency Lib "kernel32.dll" (ByRef x As Int64) As Byte
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
Dim c1, c2, frq As Long
QueryPerformanceCounter(c1)
For i As Int64 = 0 To 20000000000
Next
QueryPerformanceCounter(c2)
QueryPerformanceFrequency(frq)
MsgBox((c2 - c1) / frq)
End Sub
End Class[/source]
و همین کد بالا به صورت تعریف متغیر یک خط قبل از حلقه .
شما با اجرای این کدها باید اعداد برابر بگیرین.
اگر باز هم اعداد نابرابر گرفتین زحمت بکشین و این دو تا برنامه رو که اگزه هم هست اجرا کنین و بگین که آیا زمان نابرابر میگیرین ؟(ضمیمه شده)
(ضمنا حواستون باشه چون برنامه موقع شروع به کار هیچی نشون نمیده ممکنه فکر کنین اجرا نشده و چند بار دیگه روش کلیک کنین. بعد از اجرای برنامه هیچی دیده نمیشه و بعد از حدود 30 ثانیه باید مسیج باکس بگیرین)
دوست عزیز با کمال تعجب باید بگم که فابل شما با یک زمان اجرا شد 59.7
می شه کدتو بزاری
آخه من همه کاری که شما گفتید رو انجام دادم . وقتی هم اونجا توی اون تاپیک یکی از مدیران ارشد توضیح داد . دیگه مطمئن شدم
اه می شه شما کدت رو بزار تا یه بار خودم اجراییش کنم و چک کنم