السلام عليكم ورحمة الله وبركاته
لو عرفنا ماذا يحدث داخل وحدة المعالجة المركزية (
CPU )
يوجد شيء اسمه :
سجل وحدة المعالجة المركزية الأصلي
لتقريب الفكرة ( يشبة حاوية بيانات )
لتقريب الفكرة أكثر : اذا اردت أن تقوم بشحن بضاعة من الصين على متن باخرة في البحر , فأن عملية الشحن تكون داخل حاويات ( containers ) حتى لو شحنت بضاعة صغيرة جداً مثل شاشة كمبيوتر فقط , فإنك يجب أن تقوم بوضعها داخل حاوية, مع العلم أن الحاوية كبيرة وفارغة ويوجد متسع كبير لوضع أشياء كثيرة, ولكنك فقط تريد أن تقوم بشحن شاشة كمبيوتر فقط , هنا أنت مضطر إلى تأجير حاوية كاملة لعملية الشحن, حتى وأن كان معظم الحاوية سيصبح فارغ.
تخيل أن الحاوية هي ( سجل وحدة المعالجة المركزية الأصلي )
وأن المتغير من نوع ( byte ) هو البضاعة المراد شحنها ( الصندوق )
تعمل وحدة المعالجة المركزية (
CPU ) بشكل أكثر كفاءة عندما تكون البيانات التي تتم معالجتها تساوي حجم سجل وحدة المعالجة المركزية الأصلي. وينطبق هذا بشكل غير مباشر على الأكواد التي نكتبها بلغة .NET أيضًا.
في معظم الحالات ، عند إستخدام (int ) في حلقة ( Loop ) يكون أكثر كفاءة من استخدام ( byte ).
متغير من نوع ( Int ) يظهر زيادة في الأداء بنسبة 10٪ تقريبًا.
إذا كنت مهتم بالسرعة , استخدم النوع Integer بدون تفكير.
إذا كنت مهتم بحفظ المساحة في الذاكرة (فقط في حال المصفوفات الكبيرة جداً) إستخدام متغير من نوع ( byte ) إن أمكن.
وحدة المعالجة المركزية (
CPU ) :
إذا كان الكمبيوتر يعمل بنظام
32bit
فإن وحدة المعالجة المركزية (
CPU ) هي أصلاً مصممة لتعالج بيانات بحجم 32bit , كما ذكرت في الأعلى عن ( سجل وحدة المعالجة المركزية الأصلي ) وعن مثال الحاويات في البحر
( سجل وحدة المعالجة المركزية الأصلي ) طول البيانات في هذا السجل هو 32bit ( الحاوية )
أي بما معناه : لو اردت من وحدة المعالجة المركزية أن تعالج متغير من نوع ( byte ) والذي يساوي 8bit فهي أصلاً تقوم بتحويلة إلى سجل بيانات بطول ( 32bit )
سجل بطول 32bit ( يحتوي على بيانات بطول 8bit المطلوبة والباقي 24bit فارغة )
وهذا يزيد من العمل على وحدة المعالجة المركزية.
النوع Int32 هو نفسة النوع Integer الاسم يختلف لكن حجم المتغير واحد وهو 32bit والذي يساوي نفس طول بيانات ( سجل وحدة المعالجة المركزية الأصلي ) هنا لن يتم أي يعمل إضافي وسيكون أسرع , ولكن السرعة هنا تكاد تكون غير محسوسة أبداً , لأن اغلب العمليات التي نقوم بها عادية وحجمها قليل.
ولكن سيظهر الفرق عندما تقوم بعمليات تتكون من ملايين الإجراءات. عندها ستلاحظ الفرق و النوع Integer هو الأسرع بفرق تقريباً 10%.
تم تصميم وحدة المعالجة المركزية للعمل بكفاءة بقيم 32 بت
القيم الأصغر يكون التعامل معها معقد.
لفهم الموضوع :
تقوم (وحدة المعالجة المركزية) عند قراءة بايت واحد ، على سبيل المثال : مثل نوع المتغير (Byte) = حجم 8bit ، يجب على وحدة المعالجة المركزية قراءة كتلة بطول 32 بت التي تحتوي عليها,
ثم إخفاء الـ 24 بت الفارغة.
24bit + 8bit = 32bit
تريد أن تعالج 8bit
ستخفي 24bit
ولكتابة بايت واحد ، يجب عليها قراءة كتلة بطول 32 بت الوجهة ، والكتابة فوق 8bit بقيمة البايتات المطلوبة ، وإعادة كتابة كتلة بطول 32bit بأكملها مرة أخرى.
من ناحية المساحة ، بالطبع ، يمكنك حفظ عدد قليل من البايتات باستخدام أنواع بيانات أصغر.
لاحظ هنا اتكلم عن سرعة معالجة البيانات وليس عن حفظ المساحة
لذلك إذا كنت تقوم ببناء جدول في قاعدة البيانات ويحتوي على ملايين من الصفوف ، سيكون من المفيد التفكير في أنواع البيانات الأقصر صبعاً.
(وقد يكون هذا سببًا جيدًا لاستخدام أنواع بيانات أصغر في قاعدة البيانات الخاصة بك)
ولكن عندما يتعلق الأمر بـ (وحدة المعالجة المركزية) أي المقصود سرعة البرنامج أو التطبيق , فأن نوع البيانات Integer هو الأسرع.
في الأجهزة التي تعمل بنظام
64bit ( الأحدث )
فإن ( سجل وحدة المعالجة المركزية الأصلي ) يكون بحجم 64bit
وذلك لمعالجة بيانات أكبر ككتلة واحدة
في هذة الحالة تتم المعالجة بشكل مضاعف
أي بما معناه تتم معالجة بيانات أكبر في وقت اقصر.
للمعلومية : أغلب مطورين الـ Net. ( من شركة مايكروسوفت ) اصحاب الـ Net. ( مطورين الـ Net. نفسهم ) لا يستخدمون نوع البيانات ( Byte = بحجم 8bit ) أو ( Short = بحجم 16bit) وذلك من خلال رؤية البرمجيات التي يكتبونها.
من النوادر, وسأندهش إذا وجدت أحد منهم قد استخدم هذة الأنواع من المتغيرات Byte أو Short
في النهاية , نحن نعيش في سنة 2022 , والمقارنات هذة والتحسين الجزيئي للمتغيرات كان في عصر السبعينات والثمانينات.
أما الآن المقارنة
في الأداء بين أنواع وأحجام المتغيرات تكاد تكون منعدمة وغير قابلة للتطبيق في معظم التطبيقات, إلا إذا كنت تتعامل مع قاعدة بيانات كبيرة جداً جداً جداً جداً. (وهذا فيما يخص الحجم فقط وليس سرعة الأداء)
الخلاصة : ( أكتب ما يحلو لك في البرنامج - ولا تهتم أبداً بأن هذا النوع أو ذلك النوع سيؤثر على آداء وسرعة البرنامج )
لأنه في نهاية المطاف - وحدة المعالجة المركزية (
CPU ) - ستحول البيانات
إلى كتل بحجم 32bit لأنظمة الكمبيوتر التي تعمل بنظام 32bit
وإلى كتل بحجم 64bit لأنظمة الكمبيوتر التي تعمل بنظام 64bit
أرجوا أن لا تسيء الفهم بين سرعة الأداء وبين حجم البيانات
يقاس الأداء بالسرعة التي يمكن لوحدة المعالجة المركزية تنفيذ التعليمات بها
ويتم التحكم في هذا السرعة بواسطة ساعة. مع كل ( نقرة أو نبضة أو دورة ) على مدار الساعة ، مع كل دورة تقوم وحدة المعالجة المركزية بإحضار تعليمة أو (عملية) واحدة وتنفيذها.
تقاس سرعة الساعة بالدورات في الثانية ، وتعرف
الدورة الواحدة بـ 1 هرتز. ( cpu clock
cycle )
هذا يعني أن وحدة المعالجة المركزية التي تبلغ سرعتها 3.6 جيجا هرتز ( 3.6 GHz ) يمكنها تنفيذ ( ثلاثة مليارات وستمائة مليون - 3,600,000,000) دورة في الثانية الواحدة.
كلما زادت سرعة الساعة في وحدة المعالجة المركزية ، زادت سرعة معالجتها للتعليمات.
متى أستخدم النوع (
byte ) أو (
short )؟
عند إنشاء مصفوفات كبيرة جداً .
على سبيل المثال حفظ ألوان صورة كبير جداً ( الـ pixel ) كل نقطة في الصورة يعبر عن pixel والبكسل الواحد يحتوي على 3 متغيرات ( احمر - اخضر - أزرق ) ( 255 ,255 ,255 )
تخيل الصورة بجودة عالية وحجمها كبير (4000x4000) بكسل يعني = 16,000,000 بكسل , وكل بكسل يحتوي على 3 متغيرات لتحديد لون البكسل , يعني 16,000,000x3 (الناتج) = 48,000,000 ثمانية وأربعون مليون رقم لتشكيل الصورة , كل هذة الأرقام محفوظة في مصفوفة ثلاثية الأبعاد.
هنا وفي هذة الحالة من الأفضل أكيد إستخدام النوع (Byte) لحفظ الذاكرة العشوائية الـ ( Memory ) , هذا ليس له علاقة بسرعة الأداء , ولكن بحفظ المساحة
ولماذا ؟
لعدم إستخدام مساحة أكبر من الذاكرة العشوائية الـ ( Memory ) حيث يكون توفير الذاكرة مهمًا بالفعل.
عن نفسي لم استخدم أبداً أنواع بيانات أصغر من Integer
استخدمت هذة الأنواع
Integer = 4 Byte
Single = 4 Byte
Double = 8 Byte
Long = 8 Byte
ULong = 8 Byte
Decimal = 16 Byte
من خبرتي الشخصية (عند كتابة كود لبرنامج معين لا تزعج نفسة كثيراً بتحديد انواع البيانات بهدف سرعة الأداء )
اكتب ما يحلو لك , ( لأن الفرق الذي ستحدثة هو أجزاء من المليار لا يذكر أبداً أبداً أبداً ) فهل ستتعب نفسة لإحداث فرق يعبر عن جزء من المليار ( طبعاً لا )
لكن عند تصميم قواعد البيانات , نعم اختر انواع البيانات بعناية, وذلك لحفظ المساحة.
أرجوا أن اكون قد وفقت في طرح معلومة مفيدة.
تحياتي للجميع