ورود

View Full Version : 2 سوال در مورد مقایسه سرعت اجرای کد (کامپایلر C#.net)



mahdi bg
جمعه 14 دی 1386, 15:08 عصر
سلام
1- سرعت اجرای کدام کد سریعتر است و چرا
کد اول




If (Condition 1)


If (Condition2)


If (Condition3)


{




}




کد دوم





If (Condition 1 && Condition2 && Condition3)


}




}


2– محاسبه کدام تابع از کدام حالات زیر سریعتر است (فرض کنید 3 تا عدد دارم که A^B=C
اگر 2 تا از اعداد را به انتخاب به ما بدهند و بخواهند که سومی را بدست
بیارم کدام تابع سرعتر عمل می کند)
POW (A, B) تابع توان (عدد C را بدست بیاوریم)
یا LOG (C, B)لگاریتم (عددA را بدست بیاوریم)
ممنون

ARA
شنبه 15 دی 1386, 18:08 عصر
سوال اول گزینه 2 سریعتر است

چون اگر مثلا گزینه 1 اشتباه باشد بقیه شرطها چک نمیشه

2 رو نمیدونم

pesar irooni
سه شنبه 23 بهمن 1386, 01:34 صبح
در مورد سوال اول به نظر من سزعت جفتشون یکیه چون در هر صورت با اشتباه بودن یک شرط شرطهای دیگه چک نمیشه.
اما این نکته قابل توجه است که فرم دوم چون در قالب یک دستور اومده احتمالا کمی سریعتر عمل میکنه. البته من این رو با توجه به درس طراحی زبان گفتم چون اونجا میگه مثلا a++ سرعتش از a=a+1 بیشتر چون کمتر از یک دستوره.

BOB
چهارشنبه 24 بهمن 1386, 00:25 صبح
سلام

تابع لگاریتم سریع تر است :

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

موفق باشید

Mehdi Asgari
پنج شنبه 25 بهمن 1386, 01:32 صبح
سلام
با اجازۀ اساتید
در مورد سوال اولتون:
من برای مقایسۀ دو حالت ، دو تا کد نوشتم که فقط قسمت if اون ها با هم فرق داشت (یعنی همین دو نسخه ای که شما گفته بودید)
در حالت Debug اولین چیزی که در کد MSIL تولید شده توسط کامپایلر مشهود هست ، اندازۀ کده. نسخۀ اول کدتون ، بیشتر فضا اشغال می کنه.
نسخۀ اول:


IL_0037: stloc.s r
IL_0039: ldloc.s r
IL_003b: ldc.i4.1
IL_003c: beq.s IL_0041
IL_003e: ldc.i4.0
IL_003f: br.s IL_0042
IL_0041: ldc.i4.1
IL_0042: stloc.2
IL_0043: ldloc.0
IL_0044: ldc.i4.0
IL_0045: ceq
IL_0047: stloc.s CS$4$0000
IL_0049: ldloc.s CS$4$0000
IL_004b: brtrue.s IL_0072
IL_004d: nop
IL_004e: ldloc.1
IL_004f: ldc.i4.0
IL_0050: ceq
IL_0052: stloc.s CS$4$0000
IL_0054: ldloc.s CS$4$0000
IL_0056: brtrue.s IL_0071
IL_0058: nop
IL_0059: ldloc.2
IL_005a: ldc.i4.0
IL_005b: ceq
IL_005d: stloc.s CS$4$0000
IL_005f: ldloc.s CS$4$0000
IL_0061: brtrue.s IL_0070


نسخۀ دوم:

IL_0037: stloc.s r
IL_0039: ldloc.s r
IL_003b: ldc.i4.1
IL_003c: beq.s IL_0041
IL_003e: ldc.i4.0
IL_003f: br.s IL_0042
IL_0041: ldc.i4.1
IL_0042: stloc.2
IL_0043: ldloc.0
IL_0044: brfalse.s IL_004f
IL_0046: ldloc.1
IL_0047: brfalse.s IL_004f
IL_0049: ldloc.2
IL_004a: ldc.i4.0
IL_004b: ceq
IL_004d: br.s IL_0050
IL_004f: ldc.i4.1
IL_0050: stloc.s CS$4$0000
IL_0052: ldloc.s CS$4$0000
IL_0054: brtrue.s IL_0063

اما وقتی به صورت release پروژه رو build کردم ، هر دو حالت دقیقا یک کد خروجی رو تولید کردند .کامپایلر سی شارپ ، هر دو کد رو optimize کرده به صورت زیر:


IL_0036: stloc.s r
IL_0038: ldloc.s r
IL_003a: ldc.i4.1
IL_003b: beq.s IL_0040
IL_003d: ldc.i4.0
IL_003e: br.s IL_0041
IL_0040: ldc.i4.1
IL_0041: stloc.2
IL_0042: ldloc.0
IL_0043: brfalse.s IL_0055
IL_0045: ldloc.1
IL_0046: brfalse.s IL_0055
IL_0048: ldloc.2
IL_0049: brfalse.s IL_0055



سوال اول گزینه 2 سریعتر است

چون اگر مثلا گزینه 1 اشتباه باشد بقیه شرطها چک نمیشه
حالت دوم هم همینطوره. عملگر && در سی شارپ به صورت Short Circuit پیاده سازی شده ، مثل AndAlso در VB.NET ؛ پس در صورت false بودن اولین عملوند ، دیگه سراغ بقیه نمی ریم
(http://en.wikipedia.org/wiki/Short-circuit_evaluation
http://msdn2.microsoft.com/en-us/library/2a723cdk.aspx )
سوال دومتون رو متوجه نشدم .(با اعداد ثابت تست کردم ولی جواب نداد)