سلام
checked
{...}
کدی را که می خواهید بررسی شود بین بلاک مربوط به checked قرار دهید،کدهای خارج از این بلاک بررسی نمی شوند.در عین حال کلمه کلیدی unchecked هم موجود است.
بهترین کتاب ویبی دات نت به نظر من کتاب دیتل & دیتل هستش.
جعفرنژاد قمی به نظر من به درد کار نمی خوره.
تاپیک این همه رفته جلو ولی هنوز کسی نگفته این دو تا کد معادل هم نیستن ؟
For m = 1 To 100000
For n = 0 To 10000
for (int m = 1; m < 100000; m++)
for (int n = 0; n < 10000; n++)
تعداد تکرار حلقه ها به طرز فجیعی با هم اختلاف دارن ! اگه سرعت ایندو برابر بود بیشتر جای تعجب داشت .
حالا من بقیه را نمی دونم اما من که از این دو کد استفاده کردم.
Button1.Enabled = False
Dim V1 As Double = 996585545.21556
Dim V2 As Double = 2522314498.8892241
Dim V3 As Double = 0
Dim I As Double = 0, J As Double = 0
Dim Time As Long = DateTime.Now.TimeOfDay.TotalMilliseconds
For J = 0 To 9999999999
V3 = V1 * V2
Next
Label1.Text = DateTime.Now.TimeOfDay.TotalMilliseconds - Time
Button1.Enabled = True
Button1.Enabled = false;
double V1 = 996585545.21556;
double V2 = 2522314498.8892241;
double V3 =0;
double I = 0; double J = 0;
double Time = DateTime.Now.TimeOfDay.TotalMilliseconds;
for (J = 0; J < 9999999999; J++)
{
V3 = V1 * V2;
}
Label1.Text =Convert.ToString ( DateTime.Now.TimeOfDay.TotalMilliseconds - Time);
Button1.Enabled = true;
دانلود حسابخانه مانی، برنامه مدیریت درآمد و هزینه رایگان
هر آنچه که هستیم، نتیجه افکاریست که در گذشته داشته ایم. (بودا)
متاسفانه شما هم کدتون در دو زبان معادل همدیگه نیست .اما خوشبختانه چون شما از حلقه های تودرتو استفاده نکردین این اشتباهتون چندان تاثیرگذار در زمان برنامه نباید باشه.
بعد از اینکه کدتون رو اصلاح کردین بگین به چه اختلاف زمانی رسیدین ؟ آیا اختلاف همچنان زیاد ه ؟
/
یه سوال : دلیل اینکه اعداد رو اینطوری انتخاب کردین (مثلا 2522314498.8892241) و از اعداد رند استفاده نکردین چی بوده ؟ (چون احساس می کنم به عمد این کارو کردین مشتاقم مزیتشو بدونم)
دوست عزیز من که خودم تو چند تا پست قبل به همین مسئله اشاره کردم و شما رو به یک تاپیک جدید فرستادم
تو اون تاپیک هم سئوالم همین بود که چرا ابن دو تا دستوری که الان شما اشاره کردید از لحاظ سعت خیلی با هم فرق داردن و کدوم سریعترن
من که چند سال برنامه می نویسم تا حالا اصلا به این قضیه برخورد نکرده بود
دانلود حسابخانه مانی، برنامه مدیریت درآمد و هزینه رایگان
هر آنچه که هستیم، نتیجه افکاریست که در گذشته داشته ایم. (بودا)
حلقه های for شما در وی بی یه بار بیشتر از معادلی که برای اون نوشتین در سی شارپ اجرا میشن
برای همین از دوستمون خواستم که معادل این کد رو در سی شارپ بنویسه :
for i = 0 to 1
آیا معادلش میشه ؟
for (i=0,i<1,i++)
که این اشتباه در مثال شما زیاد بغرنج نبود چون حلقه ی تودرتو نداشتین . اما در مثال اون دوست دیگمون اختلاف زیادی رو باعث می شد ؟
متوجه منظورم شدید ؟
/
درسته ، کاملا حق با شماست ، اصلا به این موضوع توجه نکرده بودم.
نکته خیلی جالب تر این که تو برنامه ای که دوستمون گذاشت تو سیستم هایی که من امتحان کردم باز هم VB سریعتر کد را اجرا کرد!! این یعنی کلی اختلاف تو C# . البته کد خودم را تو چند تا سیستم ازجمله سیستم خونه خودم هم تست کردم که اون هم جوابش جالب شد.
Cpu : 2.8 1mb cash
Ram : 1 DDR Bus 400
VGA : Nvidia 6200(256 MB)
Main : Asus P4
Win : Vista Sp1
دانلود حسابخانه مانی، برنامه مدیریت درآمد و هزینه رایگان
هر آنچه که هستیم، نتیجه افکاریست که در گذشته داشته ایم. (بودا)
تازه متوجه شدم که شما داری به چی اشاره می کنی
منظورتون اون یک باری که کد بیشتر از اون اجرا می شه
البته اون یک بار با این که اتوی فور هم هست نباید ایقدر اختلاف ایجاد کنه مشکل اصلی مال اوون جایی بود که متغیر حله و تعریف کردیم
برخلاف نظ شما این دو تا حلقه فور با هم اختلاف دارن و اونی که متغیرر حلقه توی خود حلقه تعریف می شه خیلی سریعتر . حتی اگه اون حلقه باز توی یه حلقه دیگه باشه
یعنی
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
می شه کدتو بزاری
آخه من همه کاری که شما گفتید رو انجام دادم . وقتی هم اونجا توی اون تاپیک یکی از مدیران ارشد توضیح داد . دیگه مطمئن شدم
اه می شه شما کدت رو بزار تا یه بار خودم اجراییش کنم و چک کنم
سلام به همگی بازم دعوا سر یه چیزی که از ریشه غلط است
دوستان برای اندازه گیری زمان اجرای یه برنامه که تایمر یا کورنومتر نمیگیرن
مهندسان عزیز مگر طراحی الگوریتم پاس نکردید. حداقل clock Time CPU را اندازه بگیرید. بعدم دوستان عزیز خروجی C# و VB یکی است هر۲تاشون از یکسری کامپوننت استفاده میکنن مگه میشه یه کد تو این با آن یکی فرق کنه اونم یک چنین کد ساده ای.
اصلا از کجا میدونید که در زمان اجرای یکی از کدها cpu شما interupt نداشته؟ ببخشید اما هم کارتون هم بحثتون خیلی مسخره است بهتر نیست بجای اینکارا به کسی که این topic را گذاشته کمک کنید؟
اصلا احتیاجی به کرنومتر و و کلاک تایم سی پی یو هم نیست. راه حل اصلیش بررسی کدهای میانیه نه کلاک تایم سی پی یو.
در عین حال حالا که خودتون این راه حل رو پیشنهاد کردین ممکنه بگین کلاک تایم سی پی رو چجوری باید اندازه بگیریم برای این مثالها ؟
در درس طراحی الگوریتم پیچیدگی زمانی و تتا و ... برای الگوریتمحساب میشه که اینجا اصلا بحث سر الگوریتم نیست.(الگوریتمها برابرند) یعنی کلا چیزی که توی طراحی الگوریتم مطرح میشه به موضوع این بحث ربطی نداره.مهندسان عزیز مگر طراحی الگوریتم پاس نکردید.حداقل clock Time CPU را اندازه بگیرید.
اگه صفحات قبل رو خونده بودید می دیدید که همه از اول (بدون استثنا) واقف بودن که کدهای این دو زبان برابرند و زمانی این مساله مهم شده بود که یه مورد ناهماهنگی پیدا کرده بودن.بعدم دوستان عزیز خروجی C# و VB یکی است هر۲تاشون از یکسری کامپوننت استفاده میکنن مگه میشه یه کد تو این با آن یکی فرق کنه اونم یک چنین کد ساده ای.
گیریم که اینتراپت داشته باشه به قول شما، بازم تاثیر چندانی نداره. شما یه برنامه رو داری اجرا می کنی و ده بار هم که اجرا کنی به عددی نزدیک 60 ثانیه می رسی و برنامه دیگه رو همیشه عدد 10 ثانیه میگیری !اصلا از کجا میدونید که در زمان اجرای یکی از کدها cpu شما interupt نداشته؟
نفر اول : از تهران تا فلانجا پیاده چقدر راهه ؟
نفر دوم : حدودا m روز
نفر اول : از کجا معلوم توی سفر ، دستشوییت نگیره ؟
من تازه وارد فروم شدم اما چیزی که اینجا زیاد می بینم متلک ه ! علتشو هنوز متوجه نشدم. یعنی واقعا نمی دونم چرا کسی مثل شما باید فقط بیاد یه پست بده و بدون اینکه تاپیک رو کامل بخونه و بدون اینک بخاد راهکار مفید بده بیاد بگه شما کارتون مسخرس !ببخشید اما هم کارتون هم بحثتون خیلی مسخره است
قبل هر چیز دوست عزیز من منظورم متلک یا این چیزها نبود اگر توهین شده عذر می خواهم. اما به تاپیک و بحث دقت کنید می بینید که مشکل کجاست.
این سوال جالبی بود. من خودم اینکار را در VB.Net نکردم اما در C++ به راحتی امکان پذیر هست. اما سوال خوبی است از همکارهام اینجا می پرسم و جوابتان را می دهم.ممکنه بگین کلاک تایم سی پی رو چجوری باید اندازه بگیریم برای این مثالها ؟
اگه آن درس را یادت باشه اعلام می شه که مهم زمان الگوریتم هست و نه زبان برنامه نویسی.چیزی که توی طراحی الگوریتم مطرح میشه به موضوع این بحث ربطی نداره.
تا آنجایی که من کد ها را خواندم هر دو کد یکی نبودند. اگه میگید یکی هستند و این اتفاق بیفتد در شرایط یکسان که امکان پذیر نیست، آن وقت می شود بحث کردزمانی این مساله مهم شده بود که یه مورد ناهماهنگی پیدا کرده بودن.
اینتراپت CPU می تواند از زمان برنامه شما بیشتر طول بکشدنفر اول : از تهران تا فلانجا پیاده چقدر راهه ؟
نفر دوم : حدودا m روز
نفر اول : از کجا معلوم توی سفر ، دستشوییت نگیره ؟
اول گفتم چرا میگم مسخره است عذر هم خواستم. اما واقعا راهکار مفید می خواهید؟بدون اینک بخاد راهکار مفید بده بیاد بگه شما کارتون مسخرس !
جواب این چیزی هست که خودتان گفتید. اگه واقعا می خواهید دو زبان را مقایسه کنید باید به کد های میانه مراجعه کنید. و همچنین برای مقایسه این چنینی از زبان ویژوال استفاده نمیشه حداقل از کنسول استفاده میشود که زمانهای اضافی دیگر حذف شود.
اما دوست عزیز این چیزی هست که اینجا هم بحث می شود اما آخرین جواب خود مایکروسافت این است که در چنین سطحی در صورت یکی بودن شرایط هر دو زبان سرعت یکسانی دارند. تنها در شرایت خاص است که زبان ها متفاوت می شوند. که این را در جایی دیگر که بحث بهتر بودن بود مطرح کردم و جواب دوستان را هم دادم
سلام دوست عزیز
قول دادم که راه حال درست را ارائه بدهم. خودم نمیدونستم از همکاران پرسیدم و این راه حلیست که همکاران اینجا تو مایکروسافت استفاده میکنن البته من یک نگاه سرسری به کدهای شما انداختم جایی ندیدم که کسی از این راه حل استفاده کرده باشه.
برای این منظر کلاسی در .Net هست به اسم StopWatch در لینک زیر میتونید پیداش کنید یه نگاه بهش بندازید مشکلی بود بگید تا کمک کنم
امیدوارم که مفید بود باشه.
http://msdn.microsoft.com/en-us/libr...stopwatch.aspx
این کد معادل همون کدیه که آقای hossein-khoshseyar استفاده کردن . یعنی بررسی زمان از ابتدا تا انتهای اجرا . یعنی ایراداتی که شما به شیوه ی ایشون وارد کردید رو برطرف نکرده (مثلا اینکه اینتراپت یا بار سی پی یو تاثیرگذار باشه یا نه . در واقع این همون به تعبیر خودتون کرنومتره) در هر صورت ممنون /
بابت پست قبلیتون هم فکر می کنم دلیلی برای توضیح بیشتر وجود نداشته باشه. مثلا توضیح بیشتر در مورد بی ربط بودن طراحی الگوریتم به کد حاصل از کامپایل .
///
برگردیم سر بحث اصلی
جناب hossein-khoshseyar
من اون تاپیک که یکی از مدیران ارشد دلیلشو توضیح داده بودن رو خوندم . ظاهرا اونجا بحث تفاوت دو کد در گلوبال / لوکال بودن متغیرها بود . که خوب طبیعیه چنین نتیجه ای رو بشه گرفت .اما کلن برای بررسی این موراد به نظر من بررسی کد میانه راهگشا تر باشه .
برای بررسی کدهای میانه از ildasm استفاده کنید . من اونو در این آدرس دارم :
C:\Program Files\Microsoft SDKs\Windows\v6.0A\bin\ildasm.exe
فقط کافیه فایل اگزه رو باهاش باز کنید و به قسمت مورد نظرتون برین(مثلا رویداد موردنظر) و اونو بررسی کنین. ترجیحا وقتی مثلا منظورتون بررسی یه حلقه ی for هست اونو به ساده ترین صورت ممکن بنویسید تا بعد از تبدیل شدن به کد میانی گیج کننده نباشن. مثلا یه حلقه ی ساده با 2 بار تکرار و بدون دستور داخلی .
Public Class Form1
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim i As Int64
For i = 0 To 2
Next
End Sub
End Class
نتیجه اینچنینی را خواهید گرفت :