سؤال

لدي تساؤل الترميز الممارسة.

عندما كنت في حاجة إلى تكرار خلال قائمة صغيرة من العناصر التي يعول حد تحت 32000, انا استخدم Int16 بالنسبة لي أنا نوع المتغير بدلا من Integer.أفعل هذا لأنني أفترض باستخدام Int16 هو أكثر كفاءة من مهب كامل Integer.

هل أنا مخطئ ؟ هل هناك أي فعالية الأداء الفرق بين استخدام Int16 مقابل Integer?يجب التوقف عن استخدام Int16 و مجرد عصا مع Integer كل ما عندي من عد/التكرار ؟

هل كانت مفيدة؟

المحلول

وفقا أدناه المرجعية ، وقت التشغيل يحسن أداء Int32 ويوصي لهم عدادات أخرى يتم الوصول إليها بشكل متكرر العمليات.

من كتاب: MCTS الذاتي طقم التدريب (امتحان 70-536):Microsoft® .NET Framework 2.0 تطبيق مؤسسة التنمية

الفصل 1:"إطار الأساسيات"
الدرس 1:"باستخدام أنواع قيمة"

أفضل الممارسات:تحسين الأداء مع المدمج في أنواع

وقت التشغيل يحسن أداء صحيح 32-بت أنواع (Int32 و UInt32) ، وبالتالي استخدام تلك الأنواع على عدادات أخرى يتم الوصول إليها بشكل متكرر لا يتجزأ من المتغيرات.

عن عمليات النقطة العائمة, مزدوج هو النوع الأكثر كفاءة لأن تلك العمليات هي الأمثل من قبل الأجهزة.

أيضا, الجدول 1-1 في نفس القسم قوائم أوصى يستخدم كل نوع.ذات الصلة إلى هذه المناقشة:

  • Int16 - التشغيل البيني وغيرها من الاستخدامات المتخصصة
  • Int32 - كل أرقام عدادات
  • Int64 كبيرة كلها أرقام

نصائح أخرى

يجب أن دائما تقريبا استخدام Int32 أو Int64 (و لا أنت لا تحصل على الائتمان باستخدام UInt32 أو UInt64) عندما حلقات على مجموعة أو مجموعة من المؤشر.

السبب الأكثر وضوحا هو أقل كفاءة هو أن كل مجموعة و مجموعة الفهارس الموجودة في BCL تأخذ Int32s لذا ضمني يلقي دائما يحدث في التعليمات البرمجية التي يحاول استخدام Int16s كما في فهرس.

أقل سبب واضح (و السبب أن تأخذ المصفوفات Int32 وذلك في مؤشر) هو أن CIL المواصفات تقول أن كل عملية كومة القيم إما Int32 أو Int64.في كل مرة يمكنك إما تحميل أو تخزين قيمة أي عدد صحيح من نوع (Byte, SByte, UInt16, Int16, UInt32, أو UInt64) هناك التحويل الضمني لعملية المشاركة.موقعة أنواع لا عقوبة على التحميل ولكن لتخزين قيمة هذه المبالغ إلى الاقتطاع و تجاوز ممكن التحقق.عن توقيع أنواع كل تحميل تسجيل يمتد كل مخزن تسجيل انهيارات (وقد تجاوز ممكن التحقق).

المكان أن هذا سوف يضر بك أكثر هو حلقة نفسه ، وليس مجموعة بالوصول.على سبيل المثال تأخذ هذا الشكل البريء الحلقة:

for (short i = 0; i < 32000; i++) {
    ...
}

تبدو جيدة, أليس كذلك ؟ كلا!يمكنك أساسا تجاهل التهيئة (short i = 0) لأنه لا يحدث إلا مرة واحدة ، لكن المقارنة (i<32000) و تزايد (i++) أجزاء يحدث 32000 مرات.هنا بعض pesudo-رمز ما هذا الشيء يبدو على مستوى الجهاز:

  Int16 i = 0;
LOOP:
  Int32 temp0 = Convert_I16_To_I32(i); // !!!
  if (temp0 >= 32000) goto END;
  ...
  Int32 temp1 = Convert_I16_To_I32(i); // !!!
  Int32 temp2 = temp1 + 1;
  i = Convert_I32_To_I16(temp2); // !!!
  goto LOOP;
END:

هناك 3 التحويلات في ان هناك تشغيل 32000 مرات.وأنها كان يمكن تجنبها تماما فقط باستخدام Int32 أو Int64.

تحديث:كما قلت في تعليق لدي الآن, في الواقع كتابة بلوق وظيفة حول هذا الموضوع ، .صافي جزءا لا يتجزأ من أنواع البيانات و

Int16 قد يكون في الواقع أقل كفاءة لأن x86 تعليمات word الوصول تأخذ مساحة أكثر من تعليمات dword الوصول.وسوف تعتمد على ما JIT لا.ولكن بغض النظر عن انه يكاد يكون من المؤكد لا المزيد فعالية عندما تستخدم المتغير في التكرار.

العكس هو الصحيح.

32 (أو 64) بت الصحيحه هي أسرع من int16.في عام الأصلي نوع البيانات هو أسرع واحد.

Int16 لطيفة إذا كنت تريد أن تجعل الخاصة بك البيانات-هياكل أكبر قدر من المرونة.يوفر هذا الفضاء قد تحسين الأداء.

أي أداء الفرق ستكون صغيرة جدا على الأجهزة الحديثة لجميع المقاصد والأغراض سوف تجعل أي فرق.حاول كتابة بضع اختبار يسخر وتشغيل كل منهم بضع مئات المرات ، أن متوسط حلقة الانتهاء مرات وسترى ما أعنيه.

قد يكون من المنطقي من منظور التخزين إذا كان لديك موارد محدودة جدا - النظم المضمنة مع كومة صغيرة, سلك بروتوكولات تصميم الشبكات البطيئة (مثلجي بي آر إس إلخ), وهلم جرا.

لا تفترض الكفاءة.

ما هو أو ليس أكثر كفاءة تختلف من مترجم مترجم و منصة الى منصة.إلا إذا كنت فعلا اختبار هذا, ليس هناك طريقة لمعرفة ما إذا كان int16 أو الباحث هو أكثر كفاءة.

وأود أن مجرد عصا مع رجات إلا إذا كنت تأتي عبر ثبت الأداء المشكلة أن استخدام int16 إصلاحات.

استخدام Int32 على 32 بت وآلات (أو Int64 على 64 بت آلات) لأداء أسرع.استخدام أصغر عدد صحيح نوع إذا كنت حقا تشعر بالقلق إزاء الفضاء يستغرق (قد يكون أبطأ ، على الرغم من).

الآخرين هنا صحيحة ، استخدم فقط أقل من Int32 (32 بت) رمز/Int64 (64 بت رمز) إذا كنت في حاجة إليها للحصول على أقصى متطلبات التخزين ، أو على مستوى آخر من إنفاذ على الكائن الأعمال الميدانية (يجب أن لا تزال لديها وبربري مستوى التحقق في هذه الحالة بالطبع).

وبشكل عام, لا تقلق بشأن كفاءة حتى هناك مشكلة في الأداء.و في هذه الحالة الشخصي ذلك.وإذا تخمين & التحقق مع كل الطرق في حين التنميط لا تساعدك يكفي التحقق من رمز IL.

سؤال جيد على الرغم من.أنت تعلم المزيد حول كيفية مترجم يفعل شيء.إذا كنت تريد أن تتعلم البرنامج أكثر كفاءة ، تعلم أساسيات IL وكيف C#/VB القائمون على القيام بعملهم من شأنه أن يكون فكرة عظيمة.

لا أستطيع أن أتخيل أن يكون هناك أي مكاسب كبيرة في الأداء على Int16 مقابلint.

يمكنك حفظ بعض اجزاء في متغير الإعلان.

و بالتأكيد لا يستحق المتاعب عندما المواصفات تغيير كل ما كنت عد يمكن تذهب فوق 32767 الآن يمكنك اكتشاف ذلك عند التطبيق الخاص بك يبدأ رمي استثناءات...

لا يوجد مكاسب كبيرة في الأداء في استخدام نوع البيانات أصغر من Int32 ، في الواقع ، لقد قرأت في مكان ما أن استخدام Int32 سوف يكون أسرع من Int16 بسبب تخصيص الذاكرة

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top