حقيقة حوار شيق و بناء
شخصيا اثارني تحليل الأخ تمام و "دليله" الذي تبناه من أجل ان يقول ان السي شارب اقوى او لنقل اسرع من الفيجوال بيسك دوت نت و قد طرح كود ال MSIL لبرنامج مصمم بالسي شارب و الفيجوال بيسك دوت نت و كما رأينا في مثاله فالبرنامجين لهما نفس العمل رغم ان هناك فرق بين Select Case و ال Switch لكن انا لن اتطرق لهذا الفرق بل سأتطرق للنقطة التي ارتكز عليها حتى خرج بالاستنتاج الذي هو ان السي شارب اسرع من الفيجوال دوت نت و طبعا النقطة التي ارتكز عليها هي حجم الملفين و الفرق بينهما لكن يبدو انه قد غابت عليه ملاحظة بسيطة و مهمة جدا في هذا الأمر أولا لنلاحظ الفرق بين هذين التعبيرين :
case "1":
Console.Write("1");
break;و الكود المقابل في الفيجوال بيسك دوت نت هو :
Case 1
Console.Write("1")هل لاحظتم امرا هنا ؟؟؟ هل لاحظتم الفرق بين الكود الأول بالسي شارب و الكود الثاني بالفيجوال بيسك دوت نت ؟
الفرق بسيط لكنه ادى الى اضافة تعليمة لل MSIL الفرق هو ان في التست في السي شارب الأخ تمام كتب
case "1";
اما في الفيجوال بيسك دوت نت فلم يضف ال ""
case 1
و هذا ادى الى انه تم اضافة هذا السطر في ال MSIL :
IL_000b: call string [Microsoft.VisualBasic]Microsoft.VisualBasic.CompilerServices.Conversions::ToString(int32)
و طبعا كما هو واضح فهذا السطر يقوم بعمل تحويل للرقم 1 من صيغة رقمية الى نص كون ال readLine ترجع لنا String و ليس Int
و ليس هذا فقط بل تم اضافة اشياء أخرى لنرى الفرق :
عند عدم اضافة ال "" الى التست نحصل على :
IL_0000: nop IL_0001: nop IL_0002: call string [mscorlib]System.Console::ReadLine() IL_0007: stloc.0 IL_0008: nop IL_0009: ldloc.0 IL_000a: ldc.i4.1 IL_000b: call string [Microsoft.VisualBasic]Microsoft.VisualBasic.CompilerServices.Conversions::ToString(int32) IL_0010: ldc.i4.0 IL_0011: call int32 [Microsoft.VisualBasic]Microsoft.VisualBasic.CompilerServices.Operators::CompareString(string, string, bool)
و طبعا هذا الكود هو نفسه عند كل تست
اما عندما نضيف ال "" فالبرنامج لن يحتاج الآن الى عمل Conversion و يكون ال MSIL الناتج هو :
IL_0000: call string [mscorlib]System.Console::ReadLine() IL_0005: stloc.0 IL_0006: ldloc.0 IL_0007: ldstr "1" IL_000c: ldc.i4.0 IL_000d: call int32 [Microsoft.VisualBasic]Microsoft.VisualBasic.CompilerServices.Operators::CompareString(string,
اذا لو عدلنا الكود بهذه الطريقة فسنحصل على ملف MSIL أصغر بحجم 1.69 كيلو و هنا اتلكم عن ال MSIL الخاص بالفنكشن Main ثم نأتي لتصغير أكبر بما انك ارتكزت اخي تمام على الحجم
أولا يجب ان نعلم ان كل ال Instruction التي فيها nop هي تعليمات فارغة بمعنى ان المعالج عندما يصل اليها لا يعمل أي شئ هذا اول شئ ثم نأتي لأمر آخر
لنقارن هذين السطرين :
C# MSIL
IL_0010: call bool [mscorlib]System.String::op_Equality(string,string)
VB.NET MSIL
IL_000d: call int32 [Microsoft.VisualBasic]Microsoft.VisualBasic.CompilerServices.Operators::CompareString(string, string, bool)
نرى طبعا ان الأولى اكول بكثير من الثانية لكن هل هناك فرق ؟؟؟ طبعا لا فالفرق فقط أن في الفيجوال بيسك دوت نت كتب جميع ال NameSpaces يعني ال Hierarchie حتى وصل الى الفنكشن CompareString و لا اظن ان هذا سيؤثر في الأداء كون في الأخير الأمر الذي سيتم تنفيذه هو CompareString
على فكرة انا هنا عملت مقارنة بين ال MSIL لكل من الفنكشن Main الخاصة بالفيجوال دوت نت و الأخرى الخاصة بالسي شارب كوننا هنا نهتم بهما ام الباقي فليس مهما كونه ستتم كتابته حتى لو كان البرنامج فارغ من الأكواد لأنه يجب ان لا تغفل ان الفيجوال بيسك دوت نت به الكلاس MY الذي لا يوجد بالسي شارب و و اذا كان لديك فيجوال بيسك دوت نت 2005 قم بكتابة نفس البرنامج و افتحه ببرنامج ال IL DASM و ستجد انه ضمن حتى الكلاس MY في ال IL لذا ستجد ان ال IL أكبر حجما من السي شارب لذا فالمقارنة اذا اردتها ان تكون عادلة يجب ان تكون بين الأكواد المكتوبة كالكود الذي كتبته في مثالك سابقا
المهم أتمنى ان تكون فكرتي قد اتضحت و أن الحجم قد لا يكون تلك الركيزة التي يمكن ان نلجأ اليها عندما نريد ان نؤكد نقطة نظرنا
و السلام عليكم