تاثیر دسترسی به ویژگی lenght آریه در سرعت اجرای حلقه ی for - هفت خط کد انجمن پرسش و پاسخ برنامه نویسی

وبـــلاگ هــفت خــط کــد


آموزش های برنامه نویسی
۱۷۸ نفر آنلاین
۰ عضو و ۱۷۸ مهمان در سایت حاضرند

تاثیر دسترسی به ویژگی lenght آریه در سرعت اجرای حلقه ی for

+1 امتیاز
50 بازدید

سلام.

لطفا این کد رو نگاه کنید:

             int[] array = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };

            for (int i = 0, count = array.Length; i < count; i++)
            {
                // code
            }

            for (int i = 0; i < array.Length; i++)
            {
                // code
            }

 

قبل از اینکه حلقه for اول ایجاد بشه ابتدا طول آرایه رو در یک متغیر ذخیره شده  سپس از متغیر در حلقه استفاده شده ، اما در حلقه دوم به ازای هر بار چرخش یک بار به ویژگی Lenght آرایه دسترسی پیدا میشه  آیا این باعث کند تر شدن چرخش حلقه نمیشه؟  

کد IL:

.method private hidebysig static void  Main(string[] args) cil managed
{
  .entrypoint
  // Code size       63 (0x3f)
  .maxstack  3
  .locals init ([0] int32[] 'array',
           [1] int32 i,
           [2] int32 count,
           [3] bool CS$4$0000)
  IL_0000:  nop
  IL_0001:  ldc.i4.s   10
  IL_0003:  newarr     [mscorlib]System.Int32
  IL_0008:  dup
  IL_0009:  ldtoken    field valuetype '<PrivateImplementationDetails>{A451010A-8F6E-428E-895C-BDF1BFA614FF}'/'__StaticArrayInitTypeSize=40' '<PrivateImplementationDetails>{A451010A-8F6E-428E-895C-BDF1BFA614FF}'::'$$method0x6000001-1'
  IL_000e:  call       void [mscorlib]System.Runtime.CompilerServices.RuntimeHelpers::InitializeArray(class [mscorlib]System.Array,
                                                                                                      valuetype [mscorlib]System.RuntimeFieldHandle)
  IL_0013:  stloc.0
  IL_0014:  ldc.i4.0
  IL_0015:  stloc.1
  IL_0016:  ldloc.0
  IL_0017:  ldlen
  IL_0018:  conv.i4
  IL_0019:  stloc.2
  IL_001a:  br.s       IL_0022
  IL_001c:  nop
  IL_001d:  nop
  IL_001e:  ldloc.1
  IL_001f:  ldc.i4.1
  IL_0020:  add
  IL_0021:  stloc.1
  IL_0022:  ldloc.1
  IL_0023:  ldloc.2
  IL_0024:  clt
  IL_0026:  stloc.3
  IL_0027:  ldloc.3
  IL_0028:  brtrue.s   IL_001c
  IL_002a:  ldc.i4.0
  IL_002b:  stloc.1
  IL_002c:  br.s       IL_0034
  IL_002e:  nop
  IL_002f:  nop
  IL_0030:  ldloc.1
  IL_0031:  ldc.i4.1
  IL_0032:  add
  IL_0033:  stloc.1
  IL_0034:  ldloc.1
  IL_0035:  ldloc.0
  IL_0036:  ldlen
  IL_0037:  conv.i4
  IL_0038:  clt
  IL_003a:  stloc.3
  IL_003b:  ldloc.3
  IL_003c:  brtrue.s   IL_002e
  IL_003e:  ret
} // end of method Program::Main

 

سوال شده شهریور 7, 1394  بوسیله ی امیدوار (امتیاز 928)   3 12 47

1 پاسخ

+2 امتیاز
 
بهترین پاسخ
نه دوست عزیر کامپایلر ها خودشون کد دوم را جایگزین کد اول می کنند .
پاسخ داده شده شهریور 7, 1394 بوسیله ی مصطفی ساتکی (امتیاز 17,035)   17 26 66
...