نمایش نتایج 1 تا 5 از 5

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

  1. #1

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

    سلام
    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 را بدست بیاوریم)
    ممنون

  2. #2
    کاربر دائمی آواتار ARA
    تاریخ عضویت
    آبان 1383
    محل زندگی
    Bad Sector
    پست
    448
    سوال اول گزینه 2 سریعتر است

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

    2 رو نمیدونم

  3. #3
    کاربر دائمی آواتار pesar irooni
    تاریخ عضویت
    بهمن 1386
    محل زندگی
    تهران
    سن
    40
    پست
    495
    در مورد سوال اول به نظر من سزعت جفتشون یکیه چون در هر صورت با اشتباه بودن یک شرط شرطهای دیگه چک نمیشه.
    اما این نکته قابل توجه است که فرم دوم چون در قالب یک دستور اومده احتمالا کمی سریعتر عمل میکنه. البته من این رو با توجه به درس طراحی زبان گفتم چون اونجا میگه مثلا a++ سرعتش از a=a+1 بیشتر چون کمتر از یک دستوره.

  4. #4
    کاربر دائمی آواتار BOB
    تاریخ عضویت
    خرداد 1383
    محل زندگی
    http://www.mshams.ir
    پست
    450
    سلام

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

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

    موفق باشید

  5. #5
    سلام
    با اجازۀ اساتید
    در مورد سوال اولتون:
    من برای مقایسۀ دو حالت ، دو تا کد نوشتم که فقط قسمت 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 )
    سوال دومتون رو متوجه نشدم .(با اعداد ثابت تست کردم ولی جواب نداد)

قوانین ایجاد تاپیک در تالار

  • شما نمی توانید تاپیک جدید ایجاد کنید
  • شما نمی توانید به تاپیک ها پاسخ دهید
  • شما نمی توانید ضمیمه ارسال کنید
  • شما نمی توانید پاسخ هایتان را ویرایش کنید
  •