PDA

View Full Version : سوال: کم شدن سرعت برنامه هنگام استفاده از حلقه For



Hassan2500
یک شنبه 14 آبان 1391, 18:03 عصر
سلام

وقتی از حلقه های For میکنم سرعت برنامه کم میشه آیا راهی وجود داره سرعت برنامه کم نشه


Private Sub Text1_Change()
Text3 = ""
Dim i
For i = 1 To Len(Text1)
If InStr(1, Text2, Mid(Text1, i, 1)) > 0 Then Text3 = Text3 & Mid(Text1, i, 1)
Next i
End Sub


و چند سؤال راجع به این حلقه دارم

1- منظور از Dim i که بالای حلقه گذاشته میشه چیه
2- فرق Next با Next i که در پائین حلقه گذاشته میشه چیه

m2011kh
یک شنبه 14 آبان 1391, 20:02 عصر
در مورد سرعت برنامه فکر نکنم راهی باشه.
ولی در مورد دو سوال بعدیت.
اول اینکه منظور از Dim a اینه که وقتی یه حلقه ایجاد میکنی باید یه متغیر داشته باشی که با استفاده از متغیر اول و آخر حلقه رو تعیین کنی.
وقتی میگه
Fot I = 1 to Len(Text1)
یعنی I یعنی از یک تا تعداد کاراکتر های Text1 یعنی حلقه نسبت به مقدار متغیر I عمل میکند.در واقع طول حلقه را با این متغیر مشخص میکنیم.
امیدوارم منظورمو متوجه شده باشی.
درباره سوال دومتم اگه چند تا حلقه داشته باشی میتونی با نوشتن یه بار Next انتهای همه اونارو یه جا تعیین میکنی ولی وقتی مینویسی Next i منظورت اینه که این کد فقط انتهای حلقه I میباشد و نه بقیه.
بازم امیدوارم منظورمو متوجه شده باشی.اگه متوجه نشدی بگو.

SlowCode
دوشنبه 15 آبان 1391, 11:55 صبح
دوست خوبمون جواب چندتا از سوالتون رو دادن ولی این جواب اشتباهه:

درباره سوال دومتم اگه چند تا حلقه داشته باشی میتونی با نوشتن یه بار Next انتهای همه اونارو یه جا تعیین میکنی ولی وقتی مینویسی Next i منظورت اینه که این کد فقط انتهای حلقه I میباشد و نه بقیه.
اگه اینطوری باشه که کلا حلقه های تودرتو قاطی پاتی میشه!
این دوتا فرقی با هم ندارن فقط وقتی می نویسی next i کاملا معلومه که انتهای کدوم حلقه است، کاربردش توی حلقه های تودرتو هست که آدم گیج نشه.

ASedJavad
دوشنبه 15 آبان 1391, 14:51 عصر
اگه اینطوری باشه که کلا حلقه های تودرتو قاطی پاتی میشه!
این دوتا فرقی با هم ندارن فقط وقتی می نویسی next i کاملا معلومه که انتهای کدوم حلقه است، کاربردش توی حلقه های تودرتو هست که آدم گیج نشه.

بله
فرمت دستوری next i میراثیه که از کیو بیسیک بر جا مونده و الا هیچ نیازی بهش نیست!

ASedJavad
دوشنبه 15 آبان 1391, 15:09 عصر
سلام
بذارید در مورد سوال اولتون اول یکم مقدمه بنویسم تا بعد برسیم به جواب سوالتون
به اذعان خیلیها یکی از سریعترین زبانهای برنامه نویسی، زبان فرترن هست خصوصا تو بحث محاسبات عددی و این جور چیزا. مثلا هفت هشت تا حلقه تو در توی چند هزار تایی رو در کسری از ثانیه برات انجام میده. ولی تو فرترن مصیبت وقتی شروع میشه که بخوای از نتایج، خروجی بگیری. این جاست که پروژه ای که کل محاسباتش 1 ثانیه طول کشیده، چا÷ نتایجش چند برابر طول میکشه.!

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

یه سری کار های دیگه هم برا افزایش سرعت هست که البته خیلی اهمیت نداره و مثلا سرعت رو در هر هزار بار اجرای حلقه به مقدار چند صدم ثانیه افزایش میدن.
با این حال اگه خواستی بگو تا در مورد اون ها هم بنویسم.

m2011kh
دوشنبه 15 آبان 1391, 15:34 عصر
ممنون آقا محسن که اشتباهم و تصحیح کردین.
شما درست میگین انگار حواسم نبود.

Hassan2500
دوشنبه 15 آبان 1391, 20:46 عصر
جناب AsedJavad اگه میشه از هر کدوم یه مثال برام بزن و کد پست1 رو بعنوان مثال قرار بدید

ASedJavad
سه شنبه 16 آبان 1391, 01:14 صبح
مثلا این:
Private Sub Text1_Change()
Dim i
Dim x As String
For i = 1 To Len(Text1)
If InStr(1, Text2, Mid(Text1, i, 1)) > 0 Then x = x & Mid(Text1, i, 1)
Next i
Text3.Text=x
End Sub

vbhamed
سه شنبه 16 آبان 1391, 01:55 صبح
سلام

نوشتن متغير انتهاي Next يك كاربردي داره كه البته زيادم بدرد بخور نيست يعني تو برنامه نويسي ساخت يافته جايي نداره، مثال زير رو ببينيد

For i = 0 To 1000
For j = 0 To 2000
For k = 0 To 10
For l = 0 To 10
t = t
Next l, k, j, i